【问题标题】: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-8utf8 有什么区别?

【问题讨论】:

    标签: 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:

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

      >>> json.dumps({u'Caf€': 1}, ensure_ascii=True)
      '{"Caf\\u20ac": 1}'
      

    UTF-8 编码 JSON:

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

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

    【讨论】:

      猜你喜欢
      • 2012-02-25
      • 2014-04-06
      • 2018-05-11
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      • 2013-12-16
      • 2020-09-04
      • 2020-10-05
      相关资源
      最近更新 更多