在最新的Python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言。
ord和chr
在 Python 中,对于单个字符编码处理有便捷的函数。ord () 函数能够获取字符的整数表示,而 chr () 函数则可将编码转换为对应的字符。例如:
print(ord('A'))
print(ord('中'))
print(chr(66))
print(chr(25991))
若已知字符的整数编码,还可以用十六进制来表示字符串,如 '\u4e2d\u6587' 等同于 ' 中文 '。
Python 中的字符串类型 str 在内存中以 Unicode 形式存在,一个字符对应若干字节。当需要在网络传输或保存到磁盘时,需将 str 转换为以字节为单位的 bytes 类型。bytes 类型的数据在 Python 中用带 b 前缀的单引号或双引号表示,如 x = b'ABC'。要区分 'ABC'(str 类型)和 b'ABC'(bytes 类型),后者每个字符只占一个字节。
encode和decode
str 类型可通过 encode () 方法编码为指定的 bytes。例如:
print('ABC'.encode('ascii'))
print('中文'.encode('utf - 8'))
try:
print('中文'.encode('ascii'))
except UnicodeEncodeError as e:
print(e)
纯英文的 str 用 ASCII 编码为 bytes 时内容不变,含中文的 str 需用 UTF - 8 编码为 bytes,若用 ASCII 编码含中文的 str 会报错,因为中文编码超出了 ASCII 范围。在 bytes 中,无法显示为 ASCII 字符的字节用 \x## 表示。
反过来,从网络或磁盘读取的字节流为 bytes 类型,要将其转换为 str,需使用 decode () 方法。例如:
print(b'ABC'.decode('ascii'))
print(b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf - 8'))
try:
print(b'\xe4\xb8\xad\xff'.decode('utf - 8'))
except UnicodeDecodeError as e:
print(e)
若 bytes 中包含无法解码的字节,decode () 方法会报错,不过可以传入 errors = 'ignore' 来忽略错误字节,如:
print(b'\xe4\xb8\xad\xff'.decode('utf - 8', errors = 'ignore'))
计算 str 包含的字符数可使用 len () 函数。当处理 bytes 时,len () 函数计算字节数。例如:
print(len('ABC'))
print(len('中文'))
print(len(b'ABC'))
print(len(b'\xe4\xb8\xad\xe6\x96\x87'))
print(len('中文'.encode('utf - 8')))
可见,一个中文字符经 UTF - 8 编码通常占用 3 个字节,英文字符占 1 个字节。
结论:
在操作字符串时,常涉及 str 和 bytes 的相互转换,为避免乱码,应始终采用 UTF - 8 编码进行转换。
由于 Python 源代码是文本文件,若包含中文,保存时需指定为 UTF - 8 编码。并且通常在文件开头写上:
#!/usr/bin/env python3
# -*- coding: utf - 8 -*-
第一行注释用于告知 Linux/OS X 系统这是 Python 可执行程序(Windows 会忽略),第二行注释告诉 Python 解释器按 UTF - 8 编码读取源代码,否则中文输出可能乱码。需注意,声明了 UTF - 8 编码不代表.py 文件就是 UTF - 8 编码,还需确保文本编辑器使用 UTF - 8 编码。若.py 文件本身是 UTF - 8 编码且有上述声明,在命令提示符下测试可正常显示中文。