【发布时间】:2017-06-12 22:28:16
【问题描述】:
我有一个 Python 服务,其端点将数据传递给另一个服务,获取结果并将其传递给请求者。表单中有一个 message 归档,如果我输入一个 Unicode 字符 - 比如说“微笑的眼睛笑脸” (U+1F601) - 我在请求表单对象中看到以下内容
ImmutableMultiDict([('message', u'\U0001f601'),...
当我得到其他服务的响应时,我有这个
{..., u'message': u'\xf0\x9f\x98\x81',...}
然后使用 json.dumps 将其 JSON 化为
{..."message": "\u00f0\u009f\u0098\u0081"...}
最后,在客户端,消息字符串被解析成
ð
(如果我没记错的话,那个字符的 Unicode 代码是\u00f0)
那么它哪里出错了?看起来我有一个使用 utf8 十六进制转义从外部服务返回的字符串。我尝试使用 utf8 解码该字符串,但出现以下错误
return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not inrange(128)
【问题讨论】:
-
u'\xf0\x9f\x98\x81'是mojibake。所以第 1 步和第 2 步之间有问题。为了让任何人解决您的问题,他们必须有权访问complete code,当给定输入ImmutableMultiDict([('message', u'\U0001f601'),...时产生{..., u'message': u'\xf0\x9f\x98\x81',...}。 -
信息还在。 :grin: 的 UTF-8 十六进制表示是
0xF0 0x9F 0x98 0x81,所以看起来是正确的。如果我在客户端执行decodeURIComponent(escape(message)),它会正确呈现。所以,我想最后我更感兴趣的是如何在 python 中正确处理这个问题。
标签: python json unicode encoding utf-8