Python3 decode()如何区分代码点?字节串是否含分隔符?
关于Python字节串decode与UTF-8编码的问题解答
字节串底层有没有分隔符?
字节串(Python里的bytes类型)底层完全没有任何分隔符。它本质就是一段连续的二进制数据,每个元素对应0-255的整数。我们平时看到的十六进制写法(比如b'\xe4\xb8\xad')只是人类为了方便阅读而做的格式化展示,底层存储时就是紧凑的二进制位,不存在额外标记来区分不同的“十六进制值”。
decode()怎么在无分隔符的情况下解析UTF-8?
这完全靠UTF-8本身的自同步编码规则,decode()函数就是依据这套规则来自动识别字符的字节边界:
- UTF-8对不同长度的字符有明确的二进制前缀约定:
- 1字节字符(ASCII):以
0开头,范围是0x00-0x7F - 2字节字符:首字节以
110开头,后续字节以10开头,首字节范围0xC0-0xDF - 3字节字符:首字节以
1110开头,后续字节以10开头,首字节范围0xE0-0xEF - 4字节字符:首字节以
11110开头,后续字节以10开头,首字节范围0xF0-0xF7
- 1字节字符(ASCII):以
- 解析时,decode()会从字节串起始位置开始,逐个判断字节的前缀特征:如果是
0开头,就单独解析为一个字符;如果是110开头,就取接下来1个字节组成2字节序列解析;以此类推,自动确定每个字符的字节长度,完成无分隔符下的正确解码。
举个实际例子:
对于字节串b'\xe4\xb8\xad\xe6\x96\x87',decode()的解析过程是:
- 第一个字节
0xe4(二进制11100100)以1110开头,判定是3字节字符,取后续两个字节0xb8、0xad,组合成完整的UTF-8编码单元,解析为中文“中” - 接着处理下一个字节
0xe6(二进制11100110),同样是3字节字符前缀,取后续0x96、0x87,解析为中文“文”
总结
字节串本身不存在分隔符,UTF-8的自同步设计让decode()可以精准识别每个字符的字节边界,不需要额外分隔符就能完成正确解析。
内容的提问来源于stack exchange,提问作者FTG
相关产品推荐
相关产品推荐

