我是HTTP相关事务的新手。 我的问题是在iOS开发中,我想使用HTTP Header发送一个字符串,所以我正在使用:
[httpRequest setValue:@"nonEnglishString" forHTTPHeaderField:@"customHeader"];
接收服务器是Python(Google App Engine),使用以下命令将字符串值保存为StringProperty:
dataEntityInstance.nonEnglishString = unicode(self.request.headers.get('customHeader')
然而,问题是当我尝试发送像韩语这样的非英语字符串时,它会像这样保存在HTTP标题中:
Customheader = "\Uc8fc\Uba39\Uc774 \Uc6b4\Ub2e4";
当Google App Engine收到并保存在DataStore中时,它会更改为:
??? ??
好像找不到unicode值的正确字符。
使用HTTP标头发送非英文字符串是不可能还是不允许?
如果我的iOS只使用setHTTPBody,它可以传输非英文字符串并正确保存到App Engine的DataStore。
[httpRequest setHTTPBody:[httpBody dataUsingEncoding:NSUTF8StringEncoding]];
但我找不到使用HTTP Headers实现相同目标的正确方法,就像Foursquare所做的许多API一样,并在基于Python的Google App Engine的DataStore中以适当的形式保存字符串
答案 0 :(得分:23)
使用HTTP标头发送非英文字符串是不可能的还是允许的?
根据HTTP标准,不可能将非ISO-8859-1字符直接放在HTTP标头中。这给你ASCII(“英语”?)字符加上常见的西欧变音符号。
但实际上,您甚至无法使用扩展的ISO-8859-1字符,因为服务器和浏览器不同意如何处理标头中的非ASCII字符。 Safari在其字中采用RFC2616并将高字节视为ISO-8859-1字符; Mozilla采用UTF-16代码单元低字节,这类似但更奇怪;来自UTF-8的Opera和Chrome解码; IE使用本地系统代码页。
所以实际上你可以放入一个HTTP头是简单的ASCII,没有控制代码。如果你想要更多,你必须提出一个编码方案(例如UTF-8 + base64)。 RFC2616标准建议使用RFC2047编码字作为标准形式的编码,但考虑到它们在RFC2047本身允许的时间定义,这没有任何意义,并且没有任何内容支持它。
答案 1 :(得分:4)
可以在HTTP标头中使用ISO 8859-1以外的字符集,但必须按照RFC 2047中的描述进行编码。