Kar*_*and 3 python unicode json python-2.x
在Python 2中,该函数json.dumps()将确保将所有非ascii字符转义为\uxxxx.
但这不是很混乱,因为它\uxxxx是一个unicode字符,应该在unicode字符串中使用.
输出json.dumps()是a str,它是Python 2中的字节字符串.因此它不应该将字符转义为\xhh?
>>> unicode_string = u"\u00f8"
>>> print unicode_string
ø
>>> print json.dumps(unicode_string)
"\u00f8"
>>> unicode_string.encode("utf8")
'\xc3\xb8'
Run Code Online (Sandbox Code Playgroud)
为什么json.dumps使用"\ uxxxx"转义非ascii字符
Python 2可以将ascii-only字符串和Unicode字符串混合在一起.
这可能是一个不成熟的优化.如果Unicode字符串在Python 2中包含大多数ASCII范围内的字符,则它们可能需要比相应字节串多2-4倍的内存.
此外,即使在今天,print(unicode_string)如果在打印到Windows控制台时包含非ascii字符,可能会很容易失败,除非win-unicode-console安装了类似Python包的内容.如果使用C/POSIX语言环境(在许多情况下是init.d服务的默认设置)(这意味着ascii字符编码)ssh,它甚至可能在Unix上失败cron.C.UTF-8但它有并不总是可用,你必须明确配置它.这可能解释了ensure_ascii=True在某些情况下您可能想要的原因.
JSON格式是为Unicode文本定义的,因此严格来说json.dumps()应始终返回Unicode字符串,但如果所有字符都在ASCII范围内(xml.etree.ElementTree具有类似的"优化"),它可能会返回字节串.令人困惑的是,Python 2允许在某些情况下将ascii-only字符串视为Unicode字符串(允许隐式转换).Python 3更严格(禁止隐式转换).
可以使用仅ASCII字节串而不是Unicode字符串(可能使用非ASCII字符)来节省内存和/或提高Python 2中的互操作性.
要禁用该行为,请使用json.dumps(obj, ensure_ascii=False).
重要的是避免将Unicode字符串与Python源代码中的表示混淆为Python字符串文字或将其在文件中表示为JSON文本.
JSON格式允许转义任何字符,而不仅仅是ASCII范围外的Unicode字符:
>>> import json
>>> json.loads(r'"\u0061"')
u'a'
>>> json.loads('"a"')
u'a'
Run Code Online (Sandbox Code Playgroud)
不要将它与Python 源代码中使用的Python字符串文字中的转义混淆.u"\u00f8"是单个 Unicode字符,但"\u00f8"在输出中是八个字符(在Python 源代码中,你可以正确r'"\u00f8"' == '"\\u00f8"' == u'"\\u00f8"'(反斜杠在Python 文字和json文本中都是特殊的- 可能会发生双重转义).而且\xJSON 中没有转义:
>>> json.loads(r'"\x61"') # invalid JSON
Traceback (most recent call last):
...
ValueError: Invalid \escape: line 1 column 2 (char 1)
>>> r'"\x61"' # valid Python literal (6 characters)
'"\\x61"'
>>> '"\x61"' # valid Python literal with escape sequence (3 characters)
'"a"'
Run Code Online (Sandbox Code Playgroud)
json.dumps()的输出是一个str,它是Python 2中的一个字节字符串.因此它不应该将字符转义为\ xhh?
json.dumps(obj, ensure_ascii=True)仅生成可打印的ascii字符,因此print repr(json.dumps(u"\xf8"))不会包含\xhh用于表示(repr())不可打印字符(字节)的转义.
\u 即使对于ascii-only输入,也可能需要转义:
#!/usr/bin/env python2
import json
print json.dumps(map(unichr, range(128)))
Run Code Online (Sandbox Code Playgroud)
["\u0000", "\u0001", "\u0002", "\u0003", "\u0004", "\u0005", "\u0006", "\u0007",
"\b", "\t", "\n", "\u000b", "\f", "\r", "\u000e", "\u000f", "\u0010", "\u0011",
"\u0012", "\u0013", "\u0014", "\u0015", "\u0016", "\u0017", "\u0018", "\u0019",
"\u001a", "\u001b", "\u001c", "\u001d", "\u001e", "\u001f", " ", "!", "\"", "#",
"$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3",
"4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C",
"D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S",
"T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c",
"d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s",
"t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "\u007f"]
Run Code Online (Sandbox Code Playgroud)
但这不是很混乱,因为\ uxxxx是一个unicode字符,应该在unicode字符串中使用
\uxxxx在某些上下文中可能被解释为单个字符的6个字符,例如,在Python中,源代码u"\uxxxx"是一个Python文字,它在内存中使用单个 Unicode字符创建Unicode字符串.但是,如果你看到\uxxxxjson文本; 如果加载它(),它是六个可能代表单个Unicode字符的字符json.loads().
此时,你应该明白为什么len(json.loads('"\\\\"')) == 1.
| 归档时间: |
|
| 查看次数: |
5193 次 |
| 最近记录: |