json编码 - 为什么utf8和utf-8产生不同的输出?

时间:2015-11-16 15:31:01

标签: json python-2.7 utf-8 character-encoding

这两个命令输出不同的结果:

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}' 之间有什么区别?

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:

  1. 传递Unicode对象
  2. 呼叫:

    >>> json.dumps({u'Caf€': 1}, ensure_ascii=True)
    '{"Caf\\u20ac": 1}'
    
  3. UTF-8编码JSON:

    1. 传递Unicode对象
    2. 呼叫:

      >>> json.dumps({u'Caf€': 1}, ensure_ascii=False).encode("utf-8")
      '{"Caf\xe2\x82\xac": 1}'