Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3中的固定长度编码_Python_Python 3.x_Encoding_Utf 8_Character Encoding - Fatal编程技术网

Python3中的固定长度编码

Python3中的固定长度编码,python,python-3.x,encoding,utf-8,character-encoding,Python,Python 3.x,Encoding,Utf 8,Character Encoding,我目前正在用Python3编写一个加密/解密程序,它可以很好地处理字符串;但是,我在将其转换为使用字节字符串时遇到了一些问题,如在UTF-8中,字符可以用1到4个字节的任意形式表示 >>>'\u0123'.encode('utf-8') b'\xc4\xa3' >>>'\uffff'.encode('utf-8') b'\xef\xbf\xbf' 经过一些研究,我发现python 3中目前没有编码,每个字节都有固定长度,所有字符都在UTF-8中-是否有任何模

我目前正在用Python3编写一个加密/解密程序,它可以很好地处理字符串;但是,我在将其转换为使用字节字符串时遇到了一些问题,如在UTF-8中,字符可以用1到4个字节的任意形式表示

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

经过一些研究,我发现python 3中目前没有编码,每个字节都有固定长度,所有字符都在UTF-8中-是否有任何模块/函数可以用来解决这个问题(比如通过附加空字节,使每个charter编码为长度为4的字节字符串)?UTF-8是一种始终使用可变字节数的编码;数量取决于输入文本的unicode代码点

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

注意,UTF-16和UTF-32编码都包括一个代码单元;一种初始码点,让解码器知道字节是以小的或大端顺序产生的。对于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'

您有UTF-16,它编码为
2*len(text)+2
bytes。UTF-8是一种可变长度编码。因此,没有,世界上任何地方都没有固定长度和UTF-8的编码。我只需要它让UTF-8UTF-16中的所有字符都不起作用-'\u0123'。encode('UTF-16')给出b'\xff\xfe\x01'和'\uffff'。encode('UTF-16')给出b'\xff\xfe\xff'。我到底做错了什么?@VladimirShevyakov:这就是BOM;它总是包含在UTF-16编码中。'\uffff'.encode('UTF-32')给出b'\xff\xfe\x00\xff\xff\x00\x00'和'\u0123'。encode('UTF-32')给出b'\xff\xfe\x00\x01\x00\x00'。#是做什么的?@VladimirShevyakov:同样,这是BOM表。我会更新(但要耐心,在火车上,连接是可变的)。