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

python3解码utf-8明文

python:print含有中文的list

调用必须与以“un”开头的函数名称一起使用。在卸载部分

python unicode to str and str to unicode

Python—编码与解码(encode()和decode())