Python Unicode 字符串字面量:'\u0391' 和 u'\u0391' 有什么区别?
我正在使用Python 2.7.3。有人能解释一下这些字面量之间的区别吗:
'\u0391'
还有:
u'\u0391'
以及它们在下面的REPL中被显示的不同方式(特别是a1后面多出来的斜杠):
>>> a1='\u0391'
>>> a1
'\\u0391'
>>> type(a1)
<type 'str'>
>>>
>>> a2=u'\u0391'
>>> a2
u'\u0391'
>>> type(a2)
<type 'unicode'>
>>>
2 个回答
3
跟C语言不一样,在Python中,字符串可以用单引号('
)或者双引号("
)来包裹,当然还有三重双引号("""
)的情况我们暂时不讨论。
所以,'\u0391'
其实只是一个字符串,它里面包含了字符 \
、u
、0
、3
、9
和 1
。当我们把这个字符串打印出来时,\
需要用另一个 \
来转义,也就是说要加个反斜杠。
而如果在字符串前面加个 u
,那么这个字符串就被认为是Unicode字符串,所有的转义字符都会被处理。所以,u'\u0391'
会被解释为“包含代码点 0391
的Unicode字符串”,这和上面的字符串是不同的。
9
你只能在 Unicode 字符串中使用 Unicode 转义(比如 \uabcd
)。在字节字符串中,这些转义是没有意义的。Python 2 中的 Unicode 字符串(比如 u'some text'
)和字节字符串(比如 'some text'
)是两种不同类型的对象。
这就像使用 \t
和 \T
的区别;前者在 Python 中有特定的含义(它表示一个制表符),而后者只是表示一个反斜杠和一个大写 T(也就是两个字符)。
为了更好地理解 Unicode 和字节字符串之间的区别,建议你阅读一下 Python Unicode 使用指南;我还推荐你看看 Joel Spolsky 关于 Unicode 的文章。
注意:在 Python 3 中,这些区别依然存在,但 'some text'
是 Unicode 字符串,而 b'some text'
是字节字符串的写法。