Geschichte der Frage:
Kodierung (encoding) und Dekodierung (decoding) von Daten sind seit dem Aufkommen der Notwendigkeit, Informationen zwischen Geräten, Programmen und Plattformen auszutauschen, relevant geworden, die Zeichen und deren Darstellung im Speicher unterschiedlich interpretieren können. In Python hat diese Aufgabe aufgrund der strengen Trennung zwischen Zeichenfolgen (str) und Bytes (bytes), beginnend mit Python 3.x, an Dringlichkeit gewonnen, wobei Zeichenfolgen Sequenzen von Unicode-Zeichen und Bytes Sequenzen von Bytes sind.
Problem:
Beim Arbeiten mit Dateien, Netzwerken und externen Systemen muss oft zwischen byte-bytes und Zeichenfolgen umgewandelt werden. Falsche Verwendung von Kodierungen kann zu UnicodeEncodeError und UnicodeDecodeError, Datenintegritätsproblemen und Problemen mit der Unterstützung verschiedener Sprachen führen.
Lösung:
In Python verwendet man die Methode .encode(), um eine Zeichenfolge in Bytes zu konvertieren, und .decode(), um die Umwandlung rückgängig zu machen. Die gebräuchlichste Kodierung ist "utf-8":
text = "Hallo, Welt!" encoded = text.encode('utf-8') # Kodieren der Zeichenfolge in Bytes print(encoded) # b'\xd0\x9f\xd1\x80...' decoded = encoded.decode('utf-8') # Rückdekodieren in die Zeichenfolge print(decoded) # 'Hallo, Welt!'
Wichtige Merkmale:
open(..., encoding='utf-8')).Was passiert, wenn man versucht, eine Byte-Zeichenfolge mit der falschen Kodierung zu dekodieren?
Beim Versuch, Bytes mit einer falschen Kodierung zu dekodieren, tritt ein Fehler auf oder es entsteht eine ungültige Zeichenfolge. Zum Beispiel:
b = b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82' wrong = b.decode('latin-1') print(wrong) # Gibt Kauderwelsch aus, nicht "Hallo"
Kann man eine Zeichenfolge und eine Byte-Zeichenfolge direkt über + verbinden?
Nein. Dies wird eine Ausnahme TypeError auslösen.
s = "abc" b = b"def" # s + b # TypeError: kann nur str (nicht "bytes") zu str hinzufügen
Kann man eine Textdatei ohne deutlich angegebene Kodierung schreiben?
Ja, aber das gilt als schlechte Praxis, da die systemweite Standardkodierung verwendet wird, die von den Betriebssystemeinstellungen abhängt, was zu Inkompatibilitäten zwischen Plattformen führt.
Ein Programmierer schreibt eine Protokolldatei in Windows ohne Angabe der Kodierung. Das Protokoll wird in Linux oder Mac geöffnet, zeigt jedoch Kauderwelsch anstelle von kyrillischen Zeichen an.
Vorteile:
Nachteile:
Ein Programmierer gibt immer encoding='utf-8' beim Arbeiten mit Dateien an:
with open('log.txt', 'w', encoding='utf-8') as f: f.write('Das Programm wurde erfolgreich beendet')
Vorteile:
Nachteile: