文章目录
- 1. 字符、码位和字节表述
- 4.1字符问题
- 2. bytes、bytearray 和 memoryview 等二进制序列的独特特性
- 3. 全部 Unicode 和陈旧字符集的编解码器
- 4.避免和处理编码错误
- 5.处理文本文件的最佳实践
- 6.默认编码的陷阱和标准 I/O 的问题
- 7.规范化 Unicode 文本,进行安全的比较
- 8.规范化、大小写折叠和暴力移除音调符号的实用函数
- 9.使用 locale 模块和 PyUCA 库正确地排序 Unicode 文本
- 10.Unicode 数据库中的字符元数据
- 11.能处理字符串和字节序列的双模式 API
1. 字符、码位和字节表述
4.1字符问题
“字符串”是个相当简单的概念:一个字符串是一个字符序列。问题出在“字符”的定义上。
在 2015 年,“字符”的最佳定义是 Unicode 字符。
Unicode 标准把字符的标识和具体的字节表述进行了如下的明确区分。
字符的标识,即码位,是 0~1 114 111 的数字(十进制),在 Unicode 标准中以 4~6
个十六进制数字表示,而且加前缀“U+”。例如,字母 A 的码位是 U+0041,欧元符号
的码位是 U+20AC,高音谱号的码位是 U+1D11E。在 Unicode 6.3 中(这是 Python 3.4
使用的标准),约 10% 的有效码位有对应的字符。
字符的具体表述取决于所用的编码。编码是在码位和字节序列之间转换时使用的算
法。在 UTF-8 编码中,A(U+0041)的码位编码成单个字节 \x41,而在 UTF-16LE
编码中编码成两个字节 \x41\x00。再举个例子,欧元符号(U+20AC)在 UTF-8 编
码中是三个字节——\xe2\x82\xac,而在 UTF-16LE 中编码成两个字
节:\xac\x20。
把码位转换成字节序列的过程是编码;把字节序列转换成码位的过程是解码。
- 如果想帮助自己记住 .decode() 和 .encode() 的区别,可以把字节序列想成
晦涩难懂的机器磁芯转储,把 Unicode 字符串想成“人类可读”的文本。那么,把字节
序列变成人类可读的文本字符串就是解码,而把字符串变成用于存储或传输的字节
序列就是编码。