我的代码会从UserVoice网站获取一些内容。您可能知道,UserVoice是一个无法正确处理数据的软件。实际上,为了减少搜索页面上的文本量,他们将文本剪切为300个字符,然后在末尾添加“...”。事实是,他们不关心在多字节字符的中间切割,导致部分utf-8“字节”:例如。对于è
字符,我得到了\xc3
而不是\xc3\xa8s
。
当然,当我向json.loads
提供这个可怕的汤时,它会以UnicodeDecodeError
失败。所以我的问题很简单:如何让json.loads
忽略这些错误的字节,就像我可以使用.decode('utf-8', 'ignore')
一样,如果我可以访问函数的内部? / p>
感谢。
答案 0 :(得分:11)
你不要求simplejson忽略它们。当我遇到类似你的问题时,我只是跑了.decode('utf-8', 'ignore').encode('utf-8')
然后继续。
答案 1 :(得分:8)
只需将Unicode字符串传递给json.loads()
:
>>> badstr = "qualité"[:-1]+".."
>>> badstr
'qualit\xc3..'
>>> json_str = '["%s"]' % badstr
>>> import json
>>> json.loads(json_str)
Traceback (most recent call last):
...
UnicodeDecodeError: 'utf8' codec can't decode byte 0xc3 in position 6: invalid \
continuation byte
>>> json.loads(json_str.decode('utf-8','ignore'))
[u'qualit..']