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

3

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

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”有什么区别呢?其实它们是一样的编码格式,只是在命名上稍有不同。请注意保留原有的HTML标签。
1个回答

1
注意第二次迭代返回的是Unicode对象。
看起来很奇怪,但文档已经解释了:
如果ensure_ascii为False,则结果可能包含非ASCII字符,并且返回值可能是一个unicode实例。
似乎只有“UTF-8”与ensure_ascii = False配合使用,并且如果输入是一个UTF-8编码的字符串(而不是Unicode),才能正常工作。对于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. Pass Unicode object
  2. Call:

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

UTF-8编码的JSON:

  1. Pass Unicode object
  2. Call:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接