# 合法的字节序列
b'123'b'123'
自然语言由字符 (character) 构成。 有的语言字符数很少,如英语的abc;有的语言的字符数很多,如中文的汉字。
用计算机处理自然语言,需建立从二进制数字到字符的映射。 编码 (encoding) 是从字符到二进制数字的映射。 解码 (decoding) 是从二进制数字到字符的映射。 用计算机处理文本,首先要确定文本文件原本的编码方式,然后用相应的解码方式将其展示为正确的文本。
最早的编码是 ASCII( American Standard Code for Information Interchange, 美国信息交换标准码),仅编码大小写英文字母、十进制数字及其他一些符号。 ASCII 用一个字节(8 位)编码一个字符,最多可编码 2^8 = 256 个字符。
如果要表示中文等非英语文字,ASCII 编码显然不够用。 各国因此开发了适用于本国文字的编码体系,如中国先后发布的 3 个汉字编码标准 GB2312,GBK,GB18030。(GB 即国标,K 即扩展)。 新的编码规则一般兼容 ASCII。但各国的编码规则往往冲突,如不同编码下,相同的二进制数字可能编码了不同字符,相同字符也可能由不同的二进制数字编码。 这使得不同语言的文字难以呈现在同一篇文档中,阻碍了信息的跨文化传播。
为解决上述问题,Unicode 用 4 个字节编码一个字符,理论上可表示 2^{32} ≈ 4 \times 10^9 个不同字符,涵盖人类使用的所有字符。
将每个字符都用 4 个字节表示,会占用太多空间。 因此Unicode 存在不同的实现方式 (Unicode transformation format),如 UTF-8,UTF-16,UTF-32。 绝大多数网页使用 UTF-8,它是一种变长编码,1个字符可能被1 \sim 4 个字节编码。越常用的字符,编码所需的位数越少。
字节序列与字符串类似,但每个元素只占用一个字节的大小,即只允许 2^8=256 个不同字符。
字符串用于处理文本数据,字节序列用于处理非文本数据(如图像,音频,视频),处理网络通信数据。
字节序列包含两种类型:bytes(不可变),bytearray(可变)。
bytes字面量的表示形式为b"ASCII字符串",也可以使用单引号或三引号。因为每个字节只能表示 2^8 = 256 个不同的整数,所以字节序列字面量的引号中的字符串必须是ASCII 字符串,主要是数字与字母,还有常用符号。 如果使用汉字,会超出这个范围,从而报错。
# 合法的字节序列
b'123'b'123'
# 非法的字节序列
b'子非鱼'Cell In[2], line 2 b'子非鱼' ^ SyntaxError: bytes can only contain ASCII literal characters
用bytes()类可以创bytes对象。 创建bytearray对象则需要使用bytearray()类。
字节序列支持索引、切片等常规的序列操作。
字符串对象的encode()方法可将其编码为字节码。 字节序列的decode()方法可将其解码为字符串。 这两个函数都接受encoding参数,规定编码方式。默认编码方式为'utf-8'。 常用的中文编码还有'gbk'。 如果读写含中文的文本文件时遭遇解码错误,可以尝试规定 encoding = 'gbk'。
# s是字符串,b是字节序列
s = "好好学习"
b = s.encode()
b
b.decode()b'\xe5\xa5\xbd\xe5\xa5\xbd\xe5\xad\xa6\xe4\xb9\xa0'
'好好学习'