Unicode
文本和字节序列
字符串是较简单的概念,一个字符串就是一个字符序列。问题在于“字符”是如何定义的。
在2021年,“字符”的最佳定义是Unicode
字符。因此从Python3
的str
对象中获取的项是Unicode
字符。Unicode
标准明确区分字符的标识和具体的字节表述。
- 字符的标识,即码点,是
0~1 114 111
范围内的数(十进制),在Unicode
标准中以4~6
个十六进制数表示,前加“U+”,取值范围是
U+0000~U+10FFFF
。例如字母A的码点是U+1D11E
。 - 字符的具体表述取决于所用的编码。编码是在码点和字节序列之间转换时使用的算法。例如字母
A(U+0041)
在UTF-8
编码中使用单个字节\x41
表述,
而在UTF-16LE
编码中使用字节序列\x41\x00
表述。再比如,欧元符号(U+20AC)
在UTF-8
编码中需要3个字节,即\xe2\x82\xac
,而在UTF-16LE
中,同一个码点编码成两个字节,即\xac\x20
.
把码点转换成字节序列的过程叫编码,把字节序列转换为码点的过程叫解码。
.encode()
是编码,将字符序列转为字节序列,为机器核心转储的字节序列,.decode()
是解码,为字节序列转为Unicode
字符串,为人类可读的文本序列。
字节概要
Python3
引入的不可变类型bytes
和可变类型bytearray
。bytes
和bytearray
中的项是0~255
(含)的整数。
虽然二进制序列其实是整数序列,但是它们的字面量表示法表明其中含有ASCII文本。因此,字节的值可能会使用以下4种不同方式显示。
- 十进制代码在
32~126
范围内的字节(从空格到波浪号),使用ASCII
字符本身。 - 制表符、换行符、回车符和
\
对应的字节,使用转义序列\t,\n,\r
和\\
。 - 如果字节序列同时包含两种字符串分隔符
'
和"
,整个序列使用'区隔,序列内的'
转义为\'
。 - 其他字节的值,使用十六进制转义序列(例如,
\x00
是空字节)。
因此,在案例b'caf\xc3\xa9'
中前三个字节b'caf'
在可打印的ASCII
范围内,后两个字节则不然。
二进制序列有一个类方法是str
没有的,名为fromhex
,它的作用是解析十六进制数字对,构建二进制序列。
构建bytes或bytearray实例还可以调用各自的构造函数,传入以下参数。
- 一个str对象和encoding关键字参数
- 一个可迭代对象,项为0~255范围内的数
- 一个实现了缓冲协议的对象(例如
bytes
,bytearray
,memoryview
,array.array
)。构造函数把源对象中的字节序列复制到新创建的二进制序列中。
使用数组中的原始数据初始化bytes对象