Python编码/解码来自JSON exceptions.UnicodeDecodeError

时间:2014-12-05 15:49:09

标签: python json unicode character-encoding

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

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

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

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

⢠Christmas 2014

(如果我尝试str())则会出现例外情况.UnicodeDecodeError错误

我在PDF上打印字符串,需要字符串:

"\u00B7 Christmas 2014 \u00B7"

我的直觉有点笨拙,我只是想用正确的unicode点取代一系列奇怪的角色,但我甚至不知道我想替换它是什么。

1 个答案:

答案 0 :(得分: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 •