【问题标题】:json encoding - Why do utf8 and utf-8 produce different outputs?json encoding - 为什么 utf8 和 utf-8 产生不同的输出?
【发布时间】:2016-02-17 18:17:07
【问题描述】:
这两个命令输出不同的结果:
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}'
utf-8 和 utf8 有什么区别?
【问题讨论】:
标签:
json
python-2.7
utf-8
character-encoding
【解决方案1】:
请注意,第二次迭代返回一个 Unicode 对象。
这看起来很奇怪,但文档指出了这一点:
如果 ensure_ascii 为 False,则结果可能包含非 ASCII 字符,返回值可能是 unicode 实例。
如果输入是 UTF-8 编码字符串(非 Unicode),则似乎只有“UTF-8”适用于 ensure_ascii=False AND。使用 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:
- 传递 Unicode 对象
-
呼叫:
>>> json.dumps({u'Caf€': 1}, ensure_ascii=True)
'{"Caf\\u20ac": 1}'
UTF-8 编码 JSON:
- 传递 Unicode 对象
-
呼叫:
>>> json.dumps({u'Caf€': 1}, ensure_ascii=False).encode("utf-8")
'{"Caf\xe2\x82\xac": 1}'