python - 加载和读取 JSON 文件的正确方法包含 Python 中的特殊字符
问题描述
我正在使用一个 JSON 文件,其中包含一些未知编码的字符串,如下例所示:
"L\u00c3\u00aa Nguy\u00e1\u00bb\u0085n Ph\u00c3\u00ba"
json.load()
我已经通过在环境中使用函数来加载此文本,Python 3.7
并尝试使用我在 Internet 上找到的一些方法对其进行编码/解码,但我仍然无法获得预期的正确字符串。(在这种情况下,它必须是Lê Nguyễn Phú
)。
我的问题是,他们使用的编码方法是什么以及如何在 Python 中以正确的方式解析这些文本?
因为 JSON 文件来自我没有处理的外部源,所以我无法知道或在对文本进行编码的过程中进行任何更改。
[更新]更多细节:
JSON 文件如下所示:
{
"content":"L\u00c3\u00aa Nguy\u00e1\u00bb\u0085n Ph\u00c3\u00ba"
}
首先,我加载了 JSON 文件:
with open(json_path, 'r') as f:
data = json.load(f)
但是当我提取内容时,这不是我所期望的:
string = data.get('content', '')
print(string)
'Lê Nguyá»\x85n Phú'
解决方案
有人拿走了“Lê Nguyễn Phú”,将其编码为 UTF-8,然后拿走了生成的一系列字节,并通过告诉 JSON 编码器这些字节是字符串的字符来欺骗它。然后 JSON 编码器通过对这些字符进行编码来协同产生垃圾。但它是可逆的垃圾。您可以使用类似的东西来扭转这个过程
json.loads(in_string).encode("latin_1").decode("utf_8")
它从 JSON 中解码字符串,从中提取字节(Latin-1 中的 256 个符号与前 256 个 Unicode 代码点一一对应),然后将这些字节重新解码为 UTF-8。
这种技术的最大问题是,它只有在您确定所有输入都以这种方式出现乱码时才有效……没有完全可靠的方法来查看输入并决定是否应该对其应用这种损坏的解码. 如果您尝试将其应用于包含高于 U+00FF 的代码点的有效编码字符串,它将崩溃。但是,如果您尝试将其应用于仅包含不超过 U+00FF 的代码点的有效编码字符串,它会将您完美的字符串变成另一种垃圾。
推荐阅读
- vue.js - VueJS 路由问题
- c++ - 如何使用 mySQL 的 CPP 驱动程序将结果集重置为其初始位置(第一行之前)?
- apache - 在 phpmyadmin 中使用 apache 的 php 文件显示在我的计算机上,但没有显示在任何其他浏览器上
- css - CSS位置粘性与底部的两个网格列
- javascript - 使用 quadraticCurve 的圆形音频可视化工具
- recursion - 树遍历和递归概念问题
- html - 如何使 CSS 中的背景图像无响应?
- sql - 根据多列计算出现次数,然后加入表
- node.js - Different Data for Different users in Mern and Jwt
- excel - Excel Graph should not have trailing empty cells take up space on axis