这两个命令输出不同的结果:
P
P^{-1}
和In [102]: json.dumps({'Café': 1}, ensure_ascii=False, encoding='utf-8')
Out[102]: '{"Caf\xc3\xa9": 1}'
In [103]: json.dumps({'Café': 1}, ensure_ascii=False, encoding='utf8')
Out[103]: u'{"Caf\xe9": 1}'
之间有什么区别?
答案 0 :(得分:1)
请注意,第二次迭代会返回一个Unicode对象。
这看起来很奇怪,但文档称之为:
如果ensure_ascii为False,则结果可能包含非ASCII字符,返回值可能是unicode实例。
如果输入是UTF-8编码的字符串(非Unicode),那么只有“UTF-8”才能与ensure_ascii=False
一起工作。使用Unicode输入:
>>> json.dumps({u'Caf€': 1}, ensure_ascii=False, encoding='utf-8')
u'{"Caf\u20ac": 1}'
对于ensure_ascii=False
,所有其他有效编码都返回一个Unicode实例。
如果设置ensure_ascii=True
,则编码是一致的,并且可以与其他编码一起使用,例如“windows-1252”(输入需要是Unicode)
我想基本原理是JSON应该是ASCII并且所有编码都应该被转义,即使它是UTF-8。
为避免任何意外,请遵循以下规则:
正确的规格。 ASCII JSON:
呼叫:
>>> json.dumps({u'Caf€': 1}, ensure_ascii=True)
'{"Caf\\u20ac": 1}'
UTF-8编码JSON:
呼叫:
>>> json.dumps({u'Caf€': 1}, ensure_ascii=False).encode("utf-8")
'{"Caf\xe2\x82\xac": 1}'