Python Unicode 字符串字面量:'\u0391' 和 u'\u0391' 有什么区别?

9 投票
2 回答
11001 浏览
提问于 2025-04-17 13:54

我正在使用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' 其实只是一个字符串,它里面包含了字符 \u0391。当我们把这个字符串打印出来时,\ 需要用另一个 \ 来转义,也就是说要加个反斜杠。

而如果在字符串前面加个 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' 是字节字符串的写法。

撰写回答