Python“string_escape”与“unicode_escape”
Posted
技术标签:
【中文标题】Python“string_escape”与“unicode_escape”【英文标题】:Python "string_escape" vs "unicode_escape" 【发布时间】:2011-02-27 11:35:32 【问题描述】:According to the docs,内置字符串编码string_escape
:
产生[s]一个适合作为 Python 源代码中的字符串字面量的字符串
...而unicode_escape
:
产生[s] 一个适合作为 Python 源代码中的 Unicode 文字的字符串
因此,它们应该具有大致相同的行为。但是,他们似乎以不同的方式对待单引号:
>>> print """before '" \0 after""".encode('string-escape')
before \'" \x00 after
>>> print """before '" \0 after""".encode('unicode-escape')
before '" \x00 after
string_escape
会转义单引号,而 Unicode 则不会。可以安全地假设我可以简单地:
>>> escaped = my_string.encode('unicode-escape').replace("'", "\\'")
...并获得预期的行为?
编辑:为了超级清楚,预期的行为是得到适合作为文字的东西。
【问题讨论】:
【参考方案1】:根据我对CPython 2.6.5源码中unicode-escape
和unicoderepr
的实现的解释,是的; repr(unicode_string)
和 unicode_string.encode('unicode-escape')
之间的唯一区别是包含换行引号和转义使用的引号。
它们都由同一个函数驱动,unicodeescape_string
。此函数接受一个参数,其唯一功能是切换添加换行引号和转义该引号。
【讨论】:
【参考方案2】:在 0 ≤ c ' 是 CPython 2.6 的唯一区别。
>>> set(unichr(c).encode('unicode_escape') for c in range(128)) - set(chr(c).encode('string_escape') for c in range(128))
set(["'"])
在此范围之外,这两种类型不可互换。
>>> '\x80'.encode('string_escape')
'\\x80'
>>> '\x80'.encode('unicode_escape')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can’t decode byte 0x80 in position 0: ordinal not in range(128)
>>> u'1'.encode('unicode_escape')
'1'
>>> u'1'.encode('string_escape')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: escape_encode() argument 1 must be str, not unicode
在 Python 3.x 上,string_escape
编码不再存在,因为str
只能存储 Unicode。
【讨论】:
那只是因为 '\x80' 不是一个有效的 ascii 编码字符串。试试u'\x80'.encode('unicode-escape')
,你会得到'\\x80'
错误非常明确:UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0: ordinal not in range(128) 表示ord
函数的结果,即:@987654329 @ 返回 128,range(128)[-1]
是 127,所以 128 不存在。
这个例子确实是错误的,因为 .encode()
不应该在 Python 2.x 中的字符串上调用。而且这个错误确实非常明确(如果你仔细阅读的话):这是一个 Unicode DECODE 错误。为什么会出现解码错误?因为.encode()
需要Unicode,并且因为它用于str
,所以首先使用默认编码解码字符串,即'ascii'。因此,错误是由于方法使用不正确而使用默认编码的隐式解码引起的。它不能证明这些类型在 0..128 范围之外是不可交换的。
所以正确答案是:在整个 0 ' 字符是唯一一个两个“编码”给出不同结果的字符。以上是关于Python“string_escape”与“unicode_escape”的主要内容,如果未能解决你的问题,请参考以下文章
python un servicio de datos en formato json,con django en python