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

问题描述:

Wikipedia告诉我UTF-32编码使用的位数是32位,那么为什么这会给我一个64位的长度?以UTF-32编码的单个字符的长度

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

UTF-32被认为是一个4字节固定长度的字符集,根据我的理解其为每一个字符将有固定的长度的范围内的32位表示它,然而,以上代码的输出是这是怎么回事?

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

编码为两个端专用的一个变体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变体让你编码或解码UTF-32无BOM ,因为你明确地设置了字节顺序。

假如你编码的多个字符,你已经注意到了,总有4个字节不是字符的数目更将需要:

>>> len('abcd'.encode('utf-32')) # (BOM + 4 chars) * 4 bytes == 20 bytes 
20 
+0

左右,BOM是相同的长度为数字字符集中任何字符的位数? – mathmaniage

+0

@BeshalJaenal BOM是另一个代码点。所以在UTF-32中,它就像任何其他码一样编码为32位。 –