2017-10-04 20 views
1

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位表示它,然而,以上代碼的輸出是這是怎麼回事?

回答

4

編碼爲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 
+0

左右,BOM是相同的長度爲數字字符集中任何字符的位數? – mathmaniage

+0

@BeshalJaenal BOM是另一個代碼點。所以在UTF-32中,它就像任何其他碼一樣編碼爲32位。 –