我正在建立一个聊天,似乎有些奇怪的字符正在悄悄进入一些消息......这是一个包含大量消息的字典的摘录。
{'message': '"..." \x85 H.L. Mencken via Midas du Metropole #quotes',...}
注意\x85
,这只是一个示例,\x92
\x91
,其他人也都有代表。据我所知,这些是不好的引号等可能是某人粘贴的。
此词典通过以下内容运行...
simplejson.dumps(DICTIONARY, indent=4).encode('utf-8')
导致此错误:
UnicodeDecodeError: 'utf8' codec can't decode byte 0x85 in position 157: invalid start byte
这是在simplejson模块中出现的:
s = s.decode('utf-8')
我有点迷失在这里,我怎样才能清理原始输入,以免我遇到这个问题?
答案 0 :(得分:1)
尝试使用以下内容转换字典中的每个值:
v = v.decode('iso-8859-1')
在将它传递给simplejson之前。
更新:这也有效:
simplejson.dumps(DICTIONARY, encoding='iso-8859-1', indent=4)
其他一些尝试:
print simplejson.dumps(DICTIONARY, encoding='cp1252')
您将看到\ x85字符的\ u2026,但这是该字符的正确Unicode代码点。
答案 1 :(得分:1)
输入字符串以cp1252
编码。在序列化为.decode
之前,json
将它们转换为Unicode字符串:
>>> D = {'message': '\x85 H.L. Mencken via \x91Midas\x92 du Metropole'.decode('cp1252')}
>>> D
{'message': u'\u2026 H.L. Mencken via \u2018Midas\u2019 du Metropole'}
>>> import json
>>> print(json.dumps(D))
{"message": "\u2026 H.L. Mencken via \u2018Midas\u2019 du Metropole"}
如果您的终端不支持其默认代码页中的字符,则可能会引发UnicodeEncodeError
,但它表明上述序列化具有正确的Unicode代码点。
>>> print(json.dumps(D,ensure_ascii=False))
{"message": "… H.L. Mencken via ‘Midas’ du Metropole"}