Python字符串:字节与Unicode

示例

Python 2.x 2.7

在Python 2中,字符串有两种变体:由类型为(str)的字节组成的字符串和由类型()的文本组成的字符串unicode。

在Python 2中,类型的对象str始终是字节序列,但通常用于文本和二进制数据。

字符串文字被解释为字节字符串。

s = 'Cafe'    # 类型== str

有两个例外:您可以通过在Unicode(文本)文字上加上前缀来显式定义Unicode(文字)文字u:

s = u'Café'   # 类型== Unicode
b = 'Lorem ipsum'  # 类型(b)== str

或者,您可以指定整个模块的字符串文字应创建Unicode(文本)文字:

from __future__ import unicode_literals

s = 'Café'   # 类型== Unicode
b = 'Lorem ipsum'  # 类型(b)== Unicode

为了检查您的变量是否是字符串(Unicode或字节字符串),可以使用:

isinstance(s, basestring)
Python 3.x 3.0

在Python 3中,该str类型是Unicode文本类型。

s = 'Cafe'           # 类型== str
s = 'Café'           # 类型== str (note the accented trailing e)

另外,Python 3添加了一个bytes对象,该对象适合于二进制“ blob”或写入与编码无关的文件。要创建一个字节对象,可以b在字符串文字前添加前缀或调用该字符串的encode方法:

# 或者,如果您确实需要一个字节字符串:
s = b'Cafe'          # 类型==字节
s = 'Café'.encode()  # 类型==字节

要测试值是否为字符串,请使用:

isinstance(s, str)
Python 3.x 3.3

也可以在字符串文字前加上u前缀,以简化Python 2和Python 3代码库之间的兼容性。由于在Python 3中,默认情况下所有字符串都是Unicode,因此在字符串文字前加上u无效:

u'Cafe' == 'Cafe'

ur不支持Python 2的原始Unicode字符串前缀,但是:

>>> ur'Café'
  File "<stdin>", line 1
    ur'Café'
           ^
SyntaxError: invalid syntax

请注意,您必须encode使用Python 3 text(str)对象将其转换bytes为该文本的表示形式。此方法的默认编码为UTF-8。

您可以decode用来向bytes对象询问它代表什么Unicode文本:

>>> b.decode()
'Café'

Python 2.x 2.6

虽然该bytes类型同时存在于Python 2和3中,但该unicode类型仅存在于Python 2中。要在Python 2中使用Python 3的隐式Unicode字符串,请将以下内容添加到代码文件的顶部:

from __future__ import unicode_literals
print(repr("hi"))
# 你好
Python 3.x 3.0

另一个重要的区别是在Python 3中索引字节会产生如下int输出:

b"abc"[0] == 97

切片为1时,对象长度为1字节:

b"abc"[0:1] == b"a"

此外,Python 3修复了Unicode的一些异常行为,例如,反转了Python 2中的字节字符串。例如,解决了以下问题:

# -*-编码:utf8-*-
print("Hi, my name is Łukasz Langa.")
print(u"Hi, my name is Łukasz Langa."[::-1])
print("Hi, my name is Łukasz Langa."[::-1])

# Python 2中的输出
# 嗨,我叫ŁukaszLanga。
# .agnaLzsakuŁsi eman ym,iH
# .agnaLzsaku  si eman ym,iH

# Python 3中的输出
# 嗨,我叫ŁukaszLanga。
# .agnaLzsakuŁsi eman ym,iH
# .agnaLzsakuŁsi eman ym,iH