以UTF-32编码的单个字符的长度

时间:2017-10-04 07:58:49

标签: python python-3.x unicode utf-32

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.如何此?

1 个答案:

答案 0 :(得分:4)

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

编码为Python提供的两个特定于endian的变体之一('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