Text versus bytes
Python3明确区分了人类可读的文本字符串和原始的字节序列。 python2与python3中的一个对应关系:
4.1 字符问题
- Unicode 是 字符集
- UTF-8 是编码规则 其中:
- 字符集: 为每一个字符分配一个唯一的ID(码位:code point)
- 编码规则: 将码位转换为字节序列的规则
示例4.1 编码和解码
>>> s = 'cafの'
>>> len(s)
4
>>> b = s.encode('utf8')
>>> b
b'caf\xe3\x81\xae'
>>> type(b)
<class 'bytes'>
>>> len(b) # 字节序列b有6个字节
6
4.2 字节概要
Python内置了两种基本的二进制序列类型:不可变的bytes类型和可变的bytearray类型。
bytes和bytearray对象的各个元素是介于0~255(含)之间的整数。
示例4-2 bytes和bytearray对象
>>> s = bytes('cafの', encoding='utf_8')
>>> s
b'caf\xe3\x81\xae'
>>> s[0]
99
>>> s[:1] #bytes对象的切片还是bytes对象
b'c'
>>> s_arr = bytearray(s)
>>> s_arr
bytearray(b'caf\xe3\x81\xae')
>>> s_arr[-1:]
bytearray(b'\xae')
4.3 基本的编解码器
编解码器用于在文本和字节之间相互转换。每个编解码器都有一个名称,如‘utf_8’,而且经常有几个别名,若'utf8','utf-8','U8'.
>>> s = 'cafの'
>>> b = s.encode('utf8')
>>> c = s.encode('utf-8')
>>> d = s.encode('utf_8')
>>> e = s.encode('U8')
>>> b,c,d,e
(b'caf\xe3\x81\xae', b'caf\xe3\x81\xae', b'caf\xe3\x81\xae', b'caf\xe3\x81\xae')
4.4 了解编解码问题
4.4.4 如何找出字节序列的编码
不能。必须有人告诉你