mat*_*age 1 python unicode python-3.x utf-32
维基百科告诉我 UTF-32 编码使用的位数是 32 位,那么为什么这给了我 64 位的长度呢?
>>> Bits(bytes = 'a'.encode('utf-32')).bin
'1111111111111110000000000000000001100001000000000000000000000000'
>>> len(Bits(bytes = 'a'.encode('utf-32')).bin)
64
Run Code Online (Sandbox Code Playgroud)
UTF-32 应该是一个 4 字节的定长字符集,根据我的理解,每个字符都有定长表示在 32 位内,然而,上面代码的输出是 64。这是怎么回事?
编码为 UTF-32 通常包括一个Byte Order Mark;您有两个编码为 UTF-32 的字符。通常需要 BOM,因为它让解码器知道数据是按小端还是大端顺序编码的。BOM 实际上只是U+FEFF 零宽度无间断空间代码点,'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
Run Code Online (Sandbox Code Playgroud)
在-le和-be变种让你编码或解码UTF-32无BOM,因为你明确设置的字节顺序。
如果您编码了多个字符,您会注意到总是比所需的字符数多 4 个字节:
>>> len('abcd'.encode('utf-32')) # (BOM + 4 chars) * 4 bytes == 20 bytes
20
Run Code Online (Sandbox Code Playgroud)