Oktette in Python
Wenn lediglich nicht-interpretierte Bitmuster ausgedrückt werden sollen, so kann ein Oktettliteral verwendet werden, in dem die Bits immer in Achtergruppen (Oktetten) durch Zahlen oder Zeichen ausgedrückt werden.
- Das Bitmuster zur Zahl 65, hexadezimal „41“, Unicode-Zeichen „A“
○●○○ ○○○● 65 A
Ein solches Bitmuster hat den Typ ›bytes‹ und kann aus einem Zahlen-Iterablen (ein Iterables, das Zahlen liefert) konstruiert werden.
- Konsolenprotokoll
bytes( ( 65, ))
b'A'
print( bytes( ( 65, )))
b'A'
Ein solches Bitmuster sieht man auch als eine Oktettfolge an, weshalb es auch durch ein Zeichenfolgenliteral mit einem vorangestellten »b« geschrieben werden kann.
- Konsolenprotokoll
b"A"
b'A'
Die Ausgabe von Oktetten erfolgt – falls möglich – zwar über ihre Zeichendarstellung, doch handelt es sich bei Oktetten nicht um Zeichen, sondern um Bitmuster. Der Unterschied besteht darin, daß ein Bitmuster keine bestimmte Interpretation (Bedeutung) hat, sondern nur eine Folge von Bits darstellt. Normalerweise wird damit allerdings eine bestimmte Information vermittels eines bestimmten Codes dargestellt, nur ist der Code nicht selber in der Oktettfolge enthalten. Daher gelten Oktettfolgen als „kodiert“, während Zeichenfolgen als „dekodiert“ gelten, denn bei letzteren ist die Interpretation der Bits als Zeichen klar.
Oktettfolgen sind kodiert.
Zeichenfolgen sind dekodiert.
Umwandlung einer Oktettfolge in eine Zeichenfolge
Eine Oktettfolge vom Typ ›bytes‹ kann mit ›str‹ in eine Zeichenfolge vom Typ ›str‹ verwandelt werden.
- Konsolenprotokoll
b = bytes( ( 65, ))
print( b )
b'A'
print( str( b ))
b'A'
Dann ergibt sich die übliche Textdarstellung von Oktettfolgen mit einem vorangestellten »b«.
Verwendung von Kennzahlen in Oktettliteralen
In Oktettliteralen können auch hexadezimale Kennzahlen nach »\x« verwendet werden.
- Konsolenprotokoll (gekürzt und übersetzt)
print( b"\x41" )
b'A'
Mit »\u«, »\U« und »\N« beginnenden Schreibweisen haben in Oktettliteralen aber nicht die spezielle Bedeutung, die sie in Zeichenfolgenliteralen haben.
Dekodierung von Oktettfolgen
Manchmal erhält man Text in einer bestimmten Kodierung als Oktettfolge. Eine Dekodierung ist dann möglich, wenn man den verwendeten Code kennt. Die Information über den verwendeten Code ist nicht in der Oktettfolge selber enthalten, sondern muß anderen Quellen entnommen werden.
- Konsolenprotokoll (gekürzt und übersetzt)
b = b'\xc3\xa4'
print( b )
b'\xc3\xa4'
print( b.decode( "utf_8" ))
ä
print( b.decode( "latin_1" ))
ä
print( b.decode( "cp1252" ))
ä
print( b.decode( "ascii" ))
UnicodeDekodierungsfehler: 'ascii'-Codec kann Byte 0xc3 an Position 0 nicht dekodieren: Ordinalzahl nicht im Bereich(128)
>>> b.decode( "ascii", errors="ignore" )
''
Zu den Namen von Kodierungen siehe “Standard Encodings ” in “The Python Library Reference ”.
Zu den möglichen Fehlerbehandlungsnamen siehe “Codec Base Classes ” in “The Python Library Reference ”.
Kodieren und Dekodieren
Zeichenfolgen können kodiert werden, was dann eine Oktettfolge ergibt.
- Konsolenprotokoll (gekürzt und übersetzt)
print( "Abstände".encode( "utf_8" ).decode( "latin_1" ))
Abstände
Solche Zeichenfolgen, die sich aus einer Dekodierung mit der falschen Code ergeben, werden auch als Zeichensalat (mojibake, 文字化け) bezeichnet. Sie lassen sich oft durch Umkehrung des Verfahrens wieder korrigieren.
- Konsolenprotokoll (gekürzt und übersetzt)
print( "Abstände".encode( "latin_1" ).decode( "utf_8" ))
Abstände