【问题标题】:How many bytes does the Python string '\x80' in UTF8 occupy? [duplicate]UTF8 中的 Python 字符串 '\x80' 占用多少字节? [复制]
【发布时间】:2020-01-07 07:43:29
【问题描述】:

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

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

【问题讨论】:

  • 注意:UTF-8 是一种编码,独立于 Python。字节字符串是字节列表,因此如果您只定义一个字节,它将占用一个字节(+ python 的开销(例如类型信息,长度)。python 中的字符串有自己的表示形式(这取决于 python 版本),但您可能应该忽略此类实现细节。字符串上的len 给出了unicode codepoints 的数量(而不是字节数)。

标签: python unicode utf-8


【解决方案1】:

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 是一个连续字节,所以它不能独立存在(它必须以一个前导字节和可能的其他一些连续字节开头才有效)。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-12
    • 2018-09-07
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多