【问题标题】:Python encode/decode from JSON exceptions.UnicodeDecodeError来自 JSON 异常的 Python 编码/解码。UnicodeDecodeError
【发布时间】:2015-02-03 20:19:10
【问题描述】:

我提取了一些类似这样的 JSON 数据:

{
 "string":"• Christmas 2014 •",
 "layer_id":490,
 "other": "attributes",
 "that_dont": "matter"
}

此 JSON 正在其他地方生成,我通过 http 请求将其拉入(使用 json.loads(request.text))。

当我在控制台中打印字符串时,我得到:

⢠Christmas 2014

(如果我尝试 str(),则会出现 exceptions.UnicodeDecodeError 错误)

我在 PDF 上打印字符串,并且需要字符串字面意思是:

"\u00B7 Christmas 2014 \u00B7"

我的直觉有点老套,我只想用适当的 unicode 点替换一系列奇怪的字符,但我什至不知道我要替换的是什么。

【问题讨论】:

  • 为什么是 U+00B7 而不是 U+2022?无论如何,那是原始内容; • Christmas 2014 •.

标签: python json unicode character-encoding


【解决方案1】:

不要使用response.text;你在这里造成Mojibake。如果响应中没有指定字符集,response.text 最终可能会使用错误的编解码器。

改用response.json(),让它为您的 JSON 处理正确的编解码器。

如果您仍然看到相同的结果,则源使用 cp1252 解码 UTF-8 数据,您需要恢复该过程:

corrected = broken.encode('cp1252').decode('utf8')

解决了您的具体问题:

>>> print u"• Christmas 2014 •".encode('cp1252').decode('utf8')
• Christmas 2014 •

那些是U+2022 BULLET 字符。

您也可以使用ftfy library,它可以为您自动处理 Mojibake 解开:

>>> import ftfy
>>> print ftfy.fix_text(u"• Christmas 2014 •")
• Christmas 2014 •

【讨论】:

  • 工作就像一个魅力。谢谢!
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 2015-11-06
  • 1970-01-01
  • 2013-08-20
  • 2018-05-05
  • 1970-01-01
  • 2010-09-26
相关资源
最近更新 更多