python中使用字节类型(bytes)来表示二进制信息,它是由单个字节构成的不可变序列。 字节类型的字面量的语法与字符串大致相同,只是添加了一个前缀`b`。 字节类型的字面量中只允许`ASCII`字符。 任何超过`127`的二进制值使用前缀`\x`和十六进制来表示。 ## 编码与解码 字符串转换为对应的编码称为编码,根据字符编码转换为字符叫解码。 ### 编码 字符串方法`.encode()`可以将字符串转换为对应的编码的`bytes`对象。 ```python >>> res = 'abc123'.encode('ascii') >>> res b'abc123' >>> type(res) bytes ``` 因为都是ascii码字符,使用本身字面量来表示,所以看起来和字符串没有什么区别,除了多了一个前缀`b`。 ```python >>> res = '中'.encode('gbk') >>> res b'\xd6\xd0' >>> len(res) 2 ``` `中`字在`gbk`中的编码为`54992`,二进制表示为: ```python >>> bin(54992) '0b1101011011010000' ``` 总共16位,需要两个字节来表示,按照16进制表示第一个字节为: ```python >>> hex(0b11010110) '0xd6' ``` 第二个字节为: ```python >>> hex(0b11010000) '0xd0' ``` 换成`\x`前缀后为: ``` '\xd6\xd0' ``` 是不是跟上面的结果一样。 ```python >>> res = '中'.encode('utf-8') b'\xe4\xb8\xad' ``` `utf-8`码,三个字节表示一个汉字。 ### 解码 bytes对象方法`.decode()`可以将字节对象转换为对应编码的字符串对象。 ```python >>> b'\xd6\xd0'.decode('gbk') '中' ``` 注意:不是所有的二进制信息都可以解码为字符,只有以字符编码组织的二进制信息才可以解码为字符。当二进制信息不是以字符编码组织的,或者使用错误的字符编码进行解码会抛出异常。 ```python >>> b'\xd6\xd0'.decode('utf-8') Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in position 0: invalid continuation byte ``` 注意:为了解决字符串不一致的问题,python3中,所有的字符串在内存中都是以`unicode`来表示的,其它的编码再通过`uniocde`进行转换。 ```python >>> '中'.encode('unicode_escape') b'\\u4e2d' # unicode >>> b'\\u4e2d'.decode() >>> b'\\u4e2d'.decode('unicode_escape') '中' ```