python - 读取包含转义 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
参数设置为open
orjson.load
似乎不会改变任何内容,因为 JSON 文件是纯 ASCII 文件,并且 unicode 在其中进行了转义。
解决方案
您所拥有的不是表情符号的正确符号;它真的意味着“ð”和三个未定义的代码点,所以你得到的翻译是正确的!(\u...
符号与编码无关。)
JavaScript 中 unicode U+1F605 的正确表示法是\ud83d\ude05
. 在 JSON 中使用它。
{
"message": "\ud83d\ude05"
}
另一方面,如果您的问题是如何从错误的数据中获得正确的结果,那么是的,正如评论所说,您可能需要通过一些障碍才能做到这一点。
推荐阅读
- swift - 如何在快速关闭呈现的控制器后推送控制器?
- rust - 如何在 Cargo 构建脚本中使用外部 crate?
- python - 在 Django 中使用模型方法的自定义模型管理器
- flutter - 在 Flutter 中序列化特殊字符
- scala - 如何更新作为主地图键值的可变地图的值?
- java - 面临异常:org.openqa.selenium.NoSuchSessionException:会话已终止或未启动站点:stackoverflow.com
- python - 如何使用 OpenCV python 获取对象的大小?
- javascript - 导出异步功能模块的正确方法是什么?
- c# - Appium 不再在 iOS 13.3 Safari 上找到元素
- typescript - 返回符号索引对象的类型函数如何?