为什么在Python的JSON编码中出现UnicodeDecodeError?
我正在使用Solr 3.3从我的数据库中索引数据。我在Python中构建JSON内容。我成功地上传了2126条记录,总共523246个字符(大约511kb)。但是当我尝试上传2027条记录时,Python给我报了错:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "D:\Technovia\db_indexer\solr_update.py", line 69, in upload_service_details
request_string.append(param_list)
File "C:\Python27\lib\json\__init__.py", line 238, in dumps
**kw).encode(obj)
File "C:\Python27\lib\json\encoder.py", line 203, in encode
chunks = list(chunks)
File "C:\Python27\lib\json\encoder.py", line 425, in _iterencode
for chunk in _iterencode_list(o, _current_indent_level):
File "C:\Python27\lib\json\encoder.py", line 326, in _iterencode_list
for chunk in chunks:
File "C:\Python27\lib\json\encoder.py", line 384, in _iterencode_dict
yield _encoder(value)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x96 in position 68: invalid start byte
哎呀。512kb是不是一个基本的限制?有没有什么高容量的替代方案可以用来处理现有的JSON模块?
更新:这是某些数据的问题,因为尝试编码 *biz_list[2126:]* 会立刻出错。这里是出问题的部分:
'2nd Floor, Gurumadhavendra Towers,\nKadavanthra Road, Kaloor,\nCochin \x96 682 017'
我该如何配置它,以便可以编码成JSON格式呢?
更新 2:答案如预期那样有效:数据来自一个MySQL表,编码为"latin-1-swedish-ci"。我发现随机数字有其重要性。抱歉在诊断问题时突然变得像个标题撰写者。
1 个回答
14
简单来说,如果你的数据不是用utf-8编码的,就别用utf-8编码。
>>> json.loads('["\x96"]')
....
UnicodeDecodeError: 'utf8' codec can't decode byte 0x96 in position 0: invalid start byte
>>> json.loads('["\x96"]', encoding="latin-1")
[u'\x96']
json.loads
如果
s
是一个字符串,并且它是用除了utf-8以外的基于ASCII的编码(比如latin-1)编码的,那么你必须指定一个合适的encoding
名称。那些不是基于ASCII的编码(比如UCS-2)是不允许的,应该先解码成unicode
。
编辑: 要获取"\x96"的正确unicode值,可以使用"cp1252",正如Eli Collins提到的。
>>> json.loads('["\x96"]', encoding="cp1252")
[u'\u2013']