使用json.dumps
时ensure_ascii
的默认值为True
,但我发现自己不断将其设置为False
:
unicode
合作,我需要通过它,否则我会回来str
我需要通过它,这样我的字符就不会转换为unicode(在str中编码)您希望在哪种情况下True
?该选项的用例是什么?
来自文档:
如果ensure_ascii为true(默认值),则输出中的所有非ASCII字符都使用\ uXXXX序列进行转义,结果是仅包含ASCII字符的str实例。
它有什么好处?
答案 0 :(得分:8)
感谢@ user2357112
首先要了解JSON中没有二进制表示。因此,所有字符串都应该是有效的unicode点。如果你正在尝试json.dumps原始字节,你可能会做错事。
然后检查:
ensure_ascii
做了两件事。确保输出有效ascii字符(即使它们内部有unicode)并允许函数返回unicode对象。 这让我认为:
ensure_ascii=False
,但实际上将其保留为true并解码str可能更有意义。 (根据规范转储不能保证unicode返回,但如果你传递unicode它会返回它。关于ensure_ascii如何影响结果,这是一个可能有用的表。
+-----------------------+--------------+------------------------------+
| Input | Ensure_ascii | output |
+-----------------------+--------------+------------------------------+
| u”汉语” | True | '"\\u6c49\\u8bed"' |
| u”汉语” | False | u'"\u6c49\u8bed"' |
| u”汉语".encode("utf-8")| True | '"\\u6c49\\u8bed"’ |
| u”汉语".encode("utf-8")| False | '"\xe6\xb1\x89\xe8\xaf\xad"' |
+-----------------------+--------------+------------------------------+
注意最后一个值是utf-8编码的unicode到字节。其他json解码器可能无法解析。
此外,如果混合类型(unicode和str的数组)并使用ensure_ascii=False
,你可以获得一个UnicodeDecodeErrror
(当编码为json时,思考混合),因为模块将返回一个unicode对象但是它无法使用默认编码(ascii)将str转换为unicode