首页 > 解决方案 > UTF8 中的 Python 字符串 '\x80' 占用多少字节?

问题描述

UTF8 中 '\x80' 占用多少字节?

在 Python 中,我写:

>>> '\x80'.encode('utf8')
b'\xc2\x80'

这表明 '\x80' 转换为两个字节。

另外,反过来:

>>> b'\x80'.decode()
>>> Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte

这是否意味着字节'\x80' 本身在​​ UTF-8 中没有(字符)含义?

标签: pythonunicodeutf-8

解决方案


Unicode 字符U+0080(它是一个控制字符:PAD)在 UTF-8 中被编码为两个字节,分别是 0xC2 和 0x80。

仅包含字节 0x80的字节流本身并不代表任何内容的有效 UTF-8 编码(即,仅该字节本身就是格式错误的 UTF-8 流)。

基本上,UTF-8 流中的每个字节都可以归类为三种不同类型之一:

  • 单字节序列:0x00-0x7F (0-127) 范围内的字节单独表示单个 Unicode Codepoint(这部分相当于旧的 US-ASCII 编码)
  • 前导字节:0xC0-0xFD (192-253) 范围内的字节开始一个多字节序列并指示该序列必须有多长*
  • 连续字节:0x80-0xBF (128-191) 范围内的字节是多字节序列的其余部分。

0x80 是一个连续字节,因此它不能独立存在(它必须以前导字节开头,并且可能还有其他一些连续字节才有效)。

关于 UTF-8的Wikipedia 文章有一些非常广泛的文档以及很好的示例。

* 请注意,由于各种原因,某些前导字节永远不会出现在有效的 UTF-8 中,因此实际使用的前导字节范围较小。同样,0xFE 和 0xFF 只是从未使用过,因此也永远不会出现在有效的 UTF-8 中。


推荐阅读