Python:解码('utf-8')打破奇数字符

时间:2015-01-22 23:47:06

标签: python encoding utf-8

我正在建立一个聊天,似乎有些奇怪的字符正在悄悄进入一些消息......这是一个包含大量消息的字典的摘录。

{'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')

我有点迷失在这里,我怎样才能清理原始输入,以免我遇到这个问题?

2 个答案:

答案 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"}