流畅的python-文本和字节序列
字符和字节
字符
“字符”的最佳定义是unicode字符,从python3的str对象中获取的元素是unicode字符,相当于从py2的unicode对象中获取的元素,而不是从py2的str对象中获取的原始字节序列。
字符的表示和具体的字节表述
- 字符的表示,即码位,在unicode标准中以4-6个十六进制数字表示。
- 字符的具体表述取决于所用的编码。如utf-8,utf-16LE
字节
python3中引入了不可变bytes类型和可变bytearray类型。bytes和bytearray对象的各个元素是介于0-255间的整数(1byte)。切片也是同一类型的二进制序列。
字节的字面量表示
- 可打印的ASCII范围内的字节,使用ASCII字符本身。
- 制表符、换行符、回车符和 \ 对应的字节,使用转义序列 \t、\n、\r 和 \。
- 其他字节的值,使用十六进制转义序列(例如,\x00 是空字节)。
byte的构造
- bytes.fromhex()
- 一个 str 对象和一个 encoding 关键字参数。
- 一个可迭代对象,提供 0~255 之间的数值。
- 一个实现了缓冲协议的对象(如 bytes、bytearray、memoryview、array.array);此时,把源对象中的字节序 列复制到新建的二进制序列中。
基本的编解码器
- Latin1:一种重要的编码,是其他编码的基础,例如 cp1252 和 Unicode(注意,latin1 与 cp1252 的字节值是一样的,甚至连码位也相同)。
- cp1252 :Microsoft 制定的 latin1 超集,添加了有用的符号,例如弯引号和€(欧元);有些 Windows 应用把它称为“ANSI”,但它并不是 ANSI 标准。
- cp437:IBM PC 最初的字符集,包含框图符号。与后来出现的 latin1 不兼容。
- gb2312:用于编码简体中文的陈旧标准;这是亚洲语言中使用较广泛的多字节编码之一。
- utf-8: 目前 Web 中最常见的 8 位编码; 与 ASCII 兼容(纯 ASCII 文本是有效的 UTF-8 文 本)。
编码问题
处理UnicodeEncodeError
可以在enocode是指定errors=xxx
>>> city = 'São Paulo'
>>> city.encode('utf_8'