【问题标题】:The correct way to load and read JSON file contains special characters in Python加载和读取 JSON 文件的正确方法包含 Python 中的特殊字符
【发布时间】:2020-09-26 03:22:35
【问题描述】:

我正在处理一个 JSON 文件,其中包含一些未知编码的字符串,如下例所示:

"L\u00c3\u00aa Nguy\u00e1\u00bb\u0085n Ph\u00c3\u00ba"

我已在Python 3.7 环境中使用json.load() 函数加载此文本,并尝试使用我在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\u00c3\u00aa Nguy\u00e1\u00bb\u0085n Ph\u00c3\u00ba" 包含 unicode 字符...但它们不是您期望的 unicode 字符...
  • "并尝试使用我在 Internet 上找到的一些方法对其进行编码/解码" 请显示您实际尝试过的事情的实际代码。另外,文件是从哪里来的?我们能看到文件相关部分的十六进制转储吗? “下面的示例”是否反映了当您在文本编辑器中打开文件时它在文件中的外观,或者它反映了它在您json.load() 并显示字符串后的外观?
  • @KarlKnechtel 很抱歉,因为我没有清楚地告诉你我有什么问题。所以,我刚刚更新了我的帖子!因为这是我在 StackOverFlow 中的第一个问题,所以如果您发现我的帖子或答案有任何问题,请告诉我。我非常感谢你的建议。谢谢!

标签: python json python-3.x string unicode


【解决方案1】:

有人拿走了“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 的代码点的有效编码字符串,它会将您完美的字符串变成另一种垃圾。

【讨论】:

  • 是的,我想用 OP 确定一些事情,但我很确定这就是答案。看起来我们发现了一个双 UTF-(m)8 的案例。 ;) 我要补充一点,如果可能的话,问题应该在源头上解决,或者安排在源头上解决
  • @hobbs 非常感谢您对我的帮助!你的建议正是我正在寻找的。我的问题是我不知道他们用什么方法来编码文本(你知道它是latin_1)。您的解释部分中的某些行我需要进行更多研究才能理解(由于我对此主题缺乏了解),但是您的回答对我来说已经足够了。谢谢!
  • @nguyendhn 仅供参考,代码行不会如图所示工作。 json.loads 与您的示例的结果将是字典,而不是字符串。真正的解决方法更难看,因为字典中的每个值都必须单独编码/解码。例如:D = json.loads(in_string); D['content'] = D['content'].encode('latin1').decode('utf8').
  • 是的。实际上,这正是我根据您的建议解决问题的方式。 :D 非常感谢!
猜你喜欢
  • 2012-12-25
  • 1970-01-01
  • 2022-11-10
  • 2013-10-26
  • 2011-04-18
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多