在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中,该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)
也可以在字符串文字前加上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é'
虽然该bytes类型同时存在于Python 2和3中,但该unicode类型仅存在于Python 2中。要在Python 2中使用Python 3的隐式Unicode字符串,请将以下内容添加到代码文件的顶部:
from __future__ import unicode_literals print(repr("hi")) # 你好
另一个重要的区别是在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