我的代码中有以下几行
outs = codecs.getwriter('utf-8')(sys.stdout)
# dJSON contains JSON message with non-ASCII chars
outs.write(json.dumps(dJSON,encoding='utf-8', ensure_ascii=False, indent=indent_val))
我收到以下异常:
outs.write(json.dumps(dJSON,encoding='utf-8', ensure_ascii=False, indent=indent_val))
File "/usr/lib/python2.7/json/__init__.py", line 238, in dumps
**kw).encode(obj)
File "/usr/lib/python2.7/json/encoder.py", line 204, in encode
return ''.join(chunks)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 27: ordinal not in range(128)
通过在encoding='utf-8'
语句中指定json.dumps
,我可以避免这种类型的问题。为什么我仍然收到错误?
答案 0 :(得分:7)
我的猜测是dJSON
对象不包含纯unicode,但它包含unicode和已编码为utf-8
的字符串的混合,例如
>>> d = {u'name':u'पाइथन'.encode('utf-8')}
>>> json.dumps(d, encoding='utf-8', ensure_ascii=False)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 238, in dumps
**kw).encode(obj)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 204, in encode
return ''.join(chunks)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 1: ordinal not in range(128)
但这有效(一切都是unicode)
>>> d = {u'name':u'पाइथन'}
>>> json.dumps(d, encoding='utf-8', ensure_ascii=False)
u'{"name": "\u092a\u093e\u0907\u0925\u0928"}
虽然这也有效(一切都是字符串)
>>> d = {'name':u'पाइथन'.encode('utf-8')}
>>> json.dumps(d, encoding='utf-8', ensure_ascii=False)
'{"name": "\xe0\xa4\xaa\xe0\xa4\xbe\xe0\xa4\x87\xe0\xa4\xa5\xe0\xa4\xa8"}'
答案 1 :(得分:4)
有一种解决方法:将utf8
编码(不是utf-8
!)传递给dumps方法。在这种情况下,它会强制所有字符串首先被解码为unicode
,并且您可以混合使用unicode字符串和已编码为UTF-8的字符串。它为什么有效?因为JSONEncoder
的源代码中有这样的东西:
if self.encoding != 'utf-8':
def _encoder(o, _orig_encoder=_encoder, _encoding=self.encoding):
if isinstance(o, str):
o = o.decode(_encoding)
return _orig_encoder(o)
这就是我们所需要的,它不会开箱即用。但是当我们将编码更改为utf8
(这与utf-8
完全相同的UTF-8)时,我们强制定义_encoder
并且一切正常:)
答案 2 :(得分:0)
根据之前的回答,您可以使用utf8
vs utf-8
解决此问题,但不包括“复制粘贴此修复”。
这里是复制粘贴此修复程序; P
your_unicode_result = json.dumps(your_dict, encoding="utf8", ensure_ascii=False)