以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
左右,BOM是相同的长度为数字字符集中任何字符的位数? – mathmaniage
@BeshalJaenal BOM是另一个代码点。所以在UTF-32中,它就像任何其他码一样编码为32位。 –