【问题标题】:Why does Python json.dumps fail on mixed utf-8 & unicode strings?为什么 Python json.dumps 在混合 utf-8 和 unicode 字符串上失败?
【发布时间】:2015-10-14 07:16:01
【问题描述】:

Python (2.x) 内置 json 库支持对 unicode 和 utf-8 编码(非 ASCII)字符串进行编码 - 但显然不能同时编码。试试:

import json; json.dumps([u'Ä', u'Ä'.encode("utf-8")], ensure_ascii=False)

并看到它引发 UnicodeDecodeError。而两者:

json.dumps([u'Ä'], ensure_ascii=False)

json.dumps([u'Ä'.encode("utf-8")], ensure_ascii=False)

...工作正常。

为什么使用 unicode 和 utf-8 编码(非 ASCII)字符串对数据进行 JSON 编码会产生 UnicodeDecodeError?我的 Python 网站编码是 ASCII。

【问题讨论】:

  • 顺便说一句,至少 ujson 处理这种情况就好了。
  • json.dumps(['Ä'.encode("utf-8")], ensure_ascii=False) 无法正常工作。
  • 哪个 Python 版本?我认为你应该使用u'Ä'.encode("utf-8")(注意你!)
  • @Petri:你也应该在另一行修复它。
  • “UTF-8 编码”不是字符串。它只是一个字节序列。

标签: python json unicode encoding utf-8


【解决方案1】:

它不起作用,因为它不知道要生成什么样的输出字符串。

在我的 Python 2.7 中:

>>> json.dumps([u'Ä'], ensure_ascii=False)
u'["\xc4"]'

(一个 Unicode 字符串)

>>> json.dumps([u'Ä'.encode("utf-8")], ensure_ascii=False)
'["\xc3\x84"]'

(一个 UTF8 编码的字节串)

所以如果你给它 UTF8 编码的字节字符串,它会产生一个 UTF8 编码的字节字符串 JSON,如果你给它 Unicode 字符串,它会产生一个 Unicode JSON。

如果你把它们混合起来,就不能两者兼得。

要解决这个问题,你可以给出一个显式的编码参数(即使默认值是正确的),它似乎总是使结果成为一个 unicode 字符串:

>>> import json; json.dumps([u'Ä', u'Ä'.encode("utf-8")], ensure_ascii=False, encoding="UTF8")
u'["\xc4", "\xc4"]'

【讨论】:

  • 注意:如果您使用encoding='utf-8' 而不是encoding='UTF8',“修复”将不起作用。为避免此问题,您应该将 Unicode 字符串传递给 json
  • 我想接受这个答案,但我不认为原因是“它不知道要生产什么”。我记得在某处读到这种情况涉及一些隐式解码......?
  • 我知道你的意思,但这是在工作时的快速回答,我没有时间研究实际发生的事情,直到稍后。让它保持打开状态,也许其他人会想出更多技术性的东西:-)
猜你喜欢
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 2011-11-08
  • 2019-07-20
  • 1970-01-01
相关资源
最近更新 更多