Python 3中的固定长度编码

时间:2015-11-18 18:13:01

标签: python python-3.x encoding utf-8 character-encoding

我目前正在使用python 3中的加密/解密程序,它可以正常使用字符串;但是,我在将其转换为使用字节字符串时遇到一些问题,因为在UTF-8中,字符可以表示为1到4个字节。

>>>'\u0123'.encode('utf-8')
b'\xc4\xa3'
>>>'\uffff'.encode('utf-8')
b'\xef\xbf\xbf'

经过一些研究,我发现python 3中目前没有编码,每个字节都有一个固定长度,并且所有字符都是UTF-8 - 是否有任何模块/函数可以用来绕过这个问题(比如通过附加空字节,以便每个章程编码为长度为4的字节串)?

1 个答案:

答案 0 :(得分:2)

UTF-8是一种总是使用可变字节数的编码;多少取决于输入文本的unicode代码点。

如果您需要可以处理Unicode的固定长度编码,请使用UTF-32(UTF-16仍然使用每个代码点2或4个字节)。

请注意,UTF-16和UTF-32编码都包含Byte Order Mark代码单元;一个初始U+FEFF ZERO WIDTH NO-BREAK SPACE代码点,让解码器知道字节是以小端还是大端顺序产生的。对于UTF-32,此代码点始终为4个字节,因此您的输出将为4 +(4 *字符数)长。

您可以通过将-le-be添加到编解码器来编码为特定的字节顺序,在这种情况下省略BOM:

>>> 'Hello world'.encode('utf-32')
b'\xff\xfe\x00\x00H\x00\x00\x00e\x00\x00\x00l\x00\x00\x00l\x00\x00\x00o\x00\x00\x00 \x00\x00\x00w\x00\x00\x00o\x00\x00\x00r\x00\x00\x00l\x00\x00\x00d\x00\x00\x00'
>>> 'Hello world'.encode('utf-32-le')
b'H\x00\x00\x00e\x00\x00\x00l\x00\x00\x00l\x00\x00\x00o\x00\x00\x00 \x00\x00\x00w\x00\x00\x00o\x00\x00\x00r\x00\x00\x00l\x00\x00\x00d\x00\x00\x00'
>>> 'Hello world'.encode('utf-32-be')
b'\x00\x00\x00H\x00\x00\x00e\x00\x00\x00l\x00\x00\x00l\x00\x00\x00o\x00\x00\x00 \x00\x00\x00w\x00\x00\x00o\x00\x00\x00r\x00\x00\x00l\x00\x00\x00d'