更新:Python 3
在Python 3中,默认使用Unicode字符串。类型str
是Unicode代码点的集合,而类型bytes
用于表示8位整数的集合(通常被解释为ASCII字符)。
以下是针对Python 3更新的问题代码:
>>> my_str = 'A unicode \u018e string \xf1'
>>> my_str
'A unicode Ǝ string ñ'
>>> my_bytes = my_str.encode('utf-8')
>>> my_bytes
b'A unicode \xc6\x8e string \xc3\xb1'
>>> my_str2 = my_bytes.decode('utf-8')
>>> my_str2 == my_str
True
文件操作:
>>> f = open('foo.txt', 'r')
>>>
>>>
>>> for line in f:
>>>
>>> f = open('foo.txt', 'rb')
>>> for line in f:
>>>
历史回答:Python 2
在 Python 2 中,str
类型是由 8 位字符组成的集合(类似于 Python 3 的 bytes
类型)。英文字母可以用这些 8 位字符表示,但是像 Ω、и、± 和 ♠ 这样的符号就不行了。
Unicode 是一种处理广泛字符集的标准。每个符号都有一个码点(一个数字),这些码点可以使用多种编码(转换为字节序列)进行编码。
UTF-8 就是这样一种编码方式。低码点使用单个字节编码,高码点则编码为字节序列。
为了让 Python 2 能够处理 Unicode 字符,它有一个 unicode
类型,该类型是 Unicode 码点的集合(类似于 Python 3 的 str
类型)。语句 ustring = u'A unicode \u018e string \xf1'
创建了一个包含 20 个字符的 Unicode 字符串。
当 Python 解释器显示 ustring
的值时,它会对两个字符(Ǝ 和 ñ)进行转义,因为它们不在标准可打印范围内。
语句 s = unistring.encode('utf-8')
使用 UTF-8 编码 Unicode 字符串。这将每个码点转换为相应的字节或字节序列。结果是一组字节,作为 str
返回。 s
的大小为 22 个字节,因为其中有两个字符具有高码点,并被编码为两个字节序列而不是单个字节。
当 Python 解释器显示 s
的值时,它会对不在可打印范围内的四个字节进行转义(\xc6
、\x8e
、\xc3
和 \xb1
)。由于 s
是 str
类型而不是 unicode
,所以两个字节对不像之前那样被视为单个字符。
语句 t = unicode(s, 'utf-8')
执行与 encode()
相反的操作。它通过查看 s
的字节并解析字节序列来重新构建原始码点。结果是一个 Unicode 字符串。
调用 codecs.open()
指定 utf-8
作为编码方式,告诉 Python 将文件的内容(一组字节)解释为使用 UTF-8 编码的 Unicode 字符串。