Python 使用转义符\u分析JSON字符串

Python 使用转义符\u分析JSON字符串,python,json,unicode,encoding,utf-8,Python,Json,Unicode,Encoding,Utf 8,我有一个Python服务,它使用和端点将数据传递给另一个服务,获取结果并将其传递给请求者。表单中有一个归档的消息,如果我输入一个Unicode字符,比如说“笑眯眯的脸”(U+1F601),我会在请求表单对象中看到以下内容 ImmutableMultiDict([('message',u'\U0001f601'),… 当我收到其他服务的响应时,我有这个 {…,u'message':u'\xf0\x9f\x98\x81',…} 然后使用json.dumps将其JSONified到 {…“消息”:“\

我有一个Python服务,它使用和端点将数据传递给另一个服务,获取结果并将其传递给请求者。表单中有一个归档的
消息
,如果我输入一个Unicode字符,比如说“笑眯眯的脸”(U+1F601),我会在请求表单对象中看到以下内容

ImmutableMultiDict([('message',u'\U0001f601'),…

当我收到其他服务的响应时,我有这个

{…,u'message':u'\xf0\x9f\x98\x81',…}

然后使用json.dumps将其JSONified到

{…“消息”:“\u00f0\u009f\u0098\u0081”…}

最后,在客户机上,消息字符串被解析为

ð

(如果我没弄错的话,该字符的Unicode代码是
\u00f0

那么它哪里出错了呢?看起来我有一个字符串,它是通过utf8十六进制转义从外部服务返回的

返回编解码器.utf_8_解码(输入,错误,真)
UnicodeEncodeError:“ascii”编解码器无法对位置0-3中的字符进行编码:序号不在范围内(128)

要正确处理此问题,您需要修复创建
u'\xf0\x9f\x98\x81'
mojibake的进程。如前所述,这些字节是正确的,但它们必须是普通字符串(在Python 3中是
字节
字符串)而不是Unicode字符串。如果不查看相关代码,我们无法提供更多详细信息

但是,您可以通过将mojibake编码为Latin 1从中提取字节码,然后将这些字节解码为UTF-8以创建适当的Unicode:

d = {u'message': u'\xf0\x9f\x98\x81'}
for k, v in d.items():
    # Extract bytes from mojibake Unicode
    b = v.encode('latin1')
    # Now decode the extracted bytes as UTF-8
    s = b.decode('UTF-8')
    print k, s
输出


message
u'\xf0\x9f\x98\x81'
是。因此,第1步和第2步之间出现了一些问题。为了让任何人解决您的问题,他们必须能够访问,当给定输入
ImmutableMultiDict([('message',u'\U0001f601')时,这些信息会产生
{…,u'message:u'\xf0\x9f\x98\x81',}
),…
。信息仍然存在。grin:的UTF-8十六进制表示形式是
0xF0 0x9F 0x98 0x81
,因此这看起来是正确的。如果我执行
解码组件(转义(消息))
在客户端,它得到了正确的渲染。因此,我想最后我更感兴趣的是如何在python中正确处理它。谢谢,我会尝试一下。不幸的是,我无法控制我得到的响应,但也许我可以做些事情,以更正确的方式处理REST本身。@alh84001 that
v.encode('latin1')).decode('utf-8')
非常有效。那些
.encode
.decode
方法都是用C编写的,我认为它们经过了很好的优化,因为它们被大量使用,所以使用它们可能比使用
decodeURIComponent
要快(不管怎么说,它们可能会在搞乱之后调用这些方法)@alh84001我想除了告诉“另一个服务”他们的应用程序在胡说八道,让他们阅读Ned Batchelder的,告诉他们一起行动,开始使用Python 3之外,你没什么别的办法了再次感谢。最后,我发现我传递给服务的字典是作为一组查询参数而不是在请求体中发布的。我想那里有一个额外的编码层,因为当切换到另一个选项时,它可以正常工作。同样感谢链接,我一定会看一看:)