如何使用HTTP头发送非英语unicode字符串?

2024-05-26 09:19:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我是HTTP相关事务的新手。 我的问题是在iOS开发中,我想使用HTTP头发送一个字符串,所以我使用:

[httpRequest setValue:@"nonEnglishString" forHTTPHeaderField:@"customHeader"];

接收服务器是Python(Google App Engine),使用以下命令将db模型中的字符串值保存为StringProperty:

dataEntityInstance.nonEnglishString = unicode(self.request.headers.get('customHeader')

但是,问题是,当我尝试发送非英语字符串(如韩语)时,它保存在HTTP头中,如下所示:

Customheader = "\Uc8fc\Uba39\Uc774 \Uc6b4\Ub2e4";

当它被Google App Engine接收并保存在数据存储中时,它会更改为:

??? ??

好像找不到unicode值的正确字符。

不可能或不允许使用HTTP头发送非英语字符串吗?

如果我的iOS只使用setHTTPBody,它可以传输非英语字符串并正确保存到App Engine的数据存储。

[httpRequest setHTTPBody:[httpBody dataUsingEncoding:NSUTF8StringEncoding]];

但我就是找不到正确的方法来使用HTTP头来实现相同的目标,就像Foursquare这样的许多api所做的那样,并将字符串保存在基于Python的Google App Engine的数据存储中


Tags: 数据字符串apphttpgoogleunicode事务engine
2条回答

Is it not POSSIBLE or ALLOWED to send non-English string using HTTP Header?

根据HTTP标准,不可能将非ISO-8859-1字符直接放在HTTP头中。这给了你ASCII(“英语”?)字符加上常见的西欧变音符号。

但是在实践中,您甚至不能使用扩展的ISO-8859-1字符,因为服务器和浏览器不同意如何处理头中的非ASCII字符。Safari采用RFC2616作为单词,并将高字节视为ISO-8859-1字符;Mozilla采用UTF-16代码单元低字节,这很相似,但更奇怪;Opera和Chrome从UTF-8解码;IE使用本地系统代码页。

所以在现实中,所有你可以放在一个HTTP头是没有控制代码的简单ASCII。如果你还想要什么,你就得想出一个编码方案(如UTF-8+base64)。RFC2616标准建议将RFC2047编码的单词作为一种标准的编码形式,但是考虑到RFC2047本身允许使用它们的定义,这是没有意义的,也没有任何东西支持它。

可以在HTTP头中使用ISO 8859-1以外的字符集,但必须按照RFC 2047中的描述对它们进行编码。

相关问题 更多 >