读取包含转义 unicode 的 JSON 时的 Mojibake - 错误地解码为 Latin-1?

Mojibake when reading JSON containing escaped unicode - wrongly decoded as Latin-1?

我有一个 JSON 文件,其中包含 /u 个转义的 unicode 字符,但是当我在 Python 中阅读此文件时,转义字符似乎被错误地解码为 Latin-1 而不是UTF-8。在受影响的字符串上调用 .encode('latin-1').decode('utf-8') 似乎可以解决这个问题,但是 为什么会这样,有没有办法指定 json.load 转义序列应该被读取为 unicode 而不是拉丁文-1?

JSON 文件 message.json,其中应包含由 "Grinning Face With Sweat" 表情符号组成的消息:

{
    "message": "\u00f0\u009f\u0098\u0085"
}

Python:

>>> with open('message.json') as infile:
...     msg_json = json.load(infile)
... 
>>> msg_json
{'message': 'ð\x9f\x98\x85'}
>>> msg_json['message']
'ð\x9f\x98\x85'
>>> msg_json['message'].encode('latin-1').decode('utf-8')
''

openjson.load 中设置 encoding 参数似乎没有任何改变,因为 JSON 文件是纯 ASCII,并且 unicode 被转义在里面。

你所拥有的表情符号符号不正确;它真的意味着“ð”和三个未定义的代码点,所以你得到的翻译是正确的! (\u... 表示法与编码无关。)

JavaScript 中 unicode U+1F605 的正确表示法是 \ud83d\ude05。在 JSON.

中使用它
{
    "message": "\ud83d\ude05"
}

另一方面,如果您的问题是如何从错误的数据中获得正确的结果,那么是的,正如评论所说,您可能必须 运行 通过一些困难才能做到这一点。