1

Wikipedia告诉我 UTF-32 编码使用的位数是 32 位,那么为什么这给了我 64 位的长度呢?

>>> Bits(bytes = 'a'.encode('utf-32')).bin
'1111111111111110000000000000000001100001000000000000000000000000'
>>> len(Bits(bytes = 'a'.encode('utf-32')).bin)
64

UTF-32 应该是一个 4 字节的固定长度字符集,根据我的理解是每个字符在 32 位内都有固定长度表示它,但是上面代码的输出是 64。这是怎么回事?

4

1 回答 1

5

编码为 UTF-32 通常包含一个字节顺序标记;您有两个编码为 UTF-32 的字符。BOM 通常是必需的,因为它让解码器知道数据是按小端还是大端顺序编码的。BOM 实际上只是U+FEFF ZERO WIDTH NO-BREAK SPACE代码点,在您的示例中被编码为'11111111111111100000000000000000'(little-endian)。

编码为 Python 提供的两种特定于字节序的变体之一 ('utf-32-le''utf-32-be') 以获取单个字符:

>>> Bits(bytes = 'a'.encode('utf-32-le')).bin
'01100001000000000000000000000000'
>>> len(Bits(bytes = 'a'.encode('utf-32-le')).bin)
32

-le和变体允许您在-be没有 BOM 的情况下对 UTF-32 进行编码或解码,因为您明确设置了字节顺序。

如果您编码了多个字符,您会注意到总是比所需的字符数多 4 个字节:

>>> len('abcd'.encode('utf-32'))  # (BOM + 4 chars) * 4 bytes == 20 bytes
20
于 2017-10-04T08:03:14.257 回答