2015-11-18 69 views
0

我目前正在使用python 3的加密/解密程序,它可以很好地處理字符串;不過,我在將它轉換爲使用字節字符串時遇到了一些問題,如在UTF-8中,字符可以表示爲1到4個字節。在Python 3中的固定長度編碼

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

經過一番研究,我發現的是,目前在Python 3沒有編碼,其具有用於每一字節的固定長度,並具有以UTF-8的所有字符 - 是否有任何模塊/功能,我可以用來解決這個問題(比如通過附加空白字節以便每個章程編碼爲長度爲4的字節字符串)?

+0

你必須UTF-16,它編碼爲'2 * LEN(文本)+ 2個字節。 –

+0

UTF-8是一種可變長度編碼。因此,不,世界上任何地方都沒有編碼*,這是固定長度和UTF-8。 –

+0

我只是需要它有UTF-8中的所有字符 –

回答

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' 
+0

'\ uffff'.encode('utf-32')給出 b'\ xff \ xfe \ x00 \ x00 \ xff \ xff \ x00 \ x00'和 '\ u0123'.encode('utf-32')給出 b'\ xff \ xfe \ x00 \ x00#\ x01 \ x00 \ x00'。 #做什麼? –

+0

@VladimirShevyakov:再次,這是包含的BOM。我會更新(但要耐心,在火車上,連通性是可變的)。 –

+0

好的,謝謝!現在工作:-) –