2017-10-04 6 views
1

Wikipedia sagt mir, dass die Anzahl der Bits von der UTF-32-Codierung verwendet 32 ​​Bit ist, warum gibt mir das eine 64-Bit-Länge?Länge eines einzelnen Zeichens codiert in UTF-32

>>> Bits(bytes = 'a'.encode('utf-32')).bin 
'1111111111111110000000000000000001100001000000000000000000000000' 
>>> len(Bits(bytes = 'a'.encode('utf-32')).bin) 
64 

UTF-32 sollte ein 4-Byte-Fixlänge Zeichensatz sein, die nach meinem Verständnis ist, dass jedes Zeichen fixiert hat Länge darstellt wäre es innerhalb von 32 Bits, aber die Ausgabe des obigen Codes ist 64. Wie ist das?

Antwort

4

Codierung zu UTF-32 enthält normalerweise eine Byte Order Mark; Sie haben zwei Zeichen in UTF-32 codiert. Die Stückliste wird normalerweise benötigt, da der Decoder wissen kann, ob die Daten in Little-Endian- oder Big-Endian-Reihenfolge codiert wurden. Die BOM ist wirklich nur der Codepunkt U+FEFF ZERO WIDTH NO-BREAK SPACE, der in Ihrem Beispiel nach '11111111111111100000000000000000' (Little-Endian) codiert ist.

Encode zu einer der beiden Endian-spezifischen Varianten Python ('utf-32-le' oder 'utf-32-be') stellt ein einzelnes Zeichen zu erhalten:

>>> Bits(bytes = 'a'.encode('utf-32-le')).bin 
'01100001000000000000000000000000' 
>>> len(Bits(bytes = 'a'.encode('utf-32-le')).bin) 
32 

Die -le und -be Varianten können Sie kodieren oder dekodieren UTF-32 ohne BOM , weil Sie die Byte-Reihenfolge explizit festlegen.

Hatten Sie mehr als ein Zeichen codiert, würden Sie bemerkt haben, dass es immer 4 Bytes mehr als die Anzahl der Zeichen erfordern würde:

>>> len('abcd'.encode('utf-32')) # (BOM + 4 chars) * 4 bytes == 20 bytes 
20 
+0

So, Die BOM ist die gleiche Länge wie die Anzahl von Bits in einem beliebigen Zeichen im Zeichensatz? – mathmaniage

+0

@BeshalJaenal die BOM ist nur ein weiterer Codepoint. In UTF-32 codiert es wie jeder andere Codepunkt auch zu 32 Bits. –

Verwandte Themen