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

pet*_*ine 20 python unicode google-app-engine http-headers ios

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

[httpRequest setValue:@"nonEnglishString" forHTTPHeaderField:@"customHeader"];
Run Code Online (Sandbox Code Playgroud)

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

dataEntityInstance.nonEnglishString = unicode(self.request.headers.get('customHeader')
Run Code Online (Sandbox Code Playgroud)

但问题是,当我尝试发送像韩语这样的非英语字符串时,它会保存在HTTP标头中,如下所示:

Customheader = "\Uc8fc\Uba39\Uc774 \Uc6b4\Ub2e4";
Run Code Online (Sandbox Code Playgroud)

当它被Google App Engine收到并保存在DataStore中时,它会改为:

??? ??
Run Code Online (Sandbox Code Playgroud)

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

使用HTTP标头发送非英语字符串是不可能的还是允许的?

如果我的iOS只使用setHTTPBody,它可以传输非英文字符串并正确保存到App Engine的DataStore.

[httpRequest setHTTPBody:[httpBody dataUsingEncoding:NSUTF8StringEncoding]];
Run Code Online (Sandbox Code Playgroud)

但我找不到使用HTTP Headers实现相同目标的正确方法,就像Foursquare所做的许多API一样,并在基于Python的Google App Engine的DataStore中以正确的形式保存字符串

bob*_*nce 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本身允许的时间定义,这没有任何意义,并且没有任何内容支持它.


Ign*_*ams 5

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