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