首页 > 解决方案 > 读取包含转义 unicode 的 JSON 时的 Mojibake - 错误地解码为 Latin-1?

问题描述

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

JSON 文件message.json,其中应包含一条由“汗流浃背的笑脸”表情符号组成的消息:

{
    "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')
''

encoding参数设置为openorjson.load似乎不会改变任何内容,因为 JSON 文件是纯 ASCII 文件,并且 unicode 在其中进行了转义。

标签: pythonjsonunicodemojibake

解决方案


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

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

{
    "message": "\ud83d\ude05"
}

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


推荐阅读