UnicodeDecodeError (Python) und Mojibake
Kurz: Python kann Bytes nicht als Text lesen, weil die Datei eine andere Zeichenkodierung hat als angenommen.
Genauer: Meldung: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe4 in position 12: invalid continuation byte oder unter Windows 'charmap' codec can't decode byte …. Texte bestehen aus Bytes; eine Kodierung legt fest, welche Bytes welchen Zeichen entsprechen. Passt die angenommene nicht zur tatsächlichen, entsteht dieser Fehler oder Mojibake („ä“ statt „ä“).
Im Detail
Ursachen
- Datei ist Latin-1/Windows-1252 (zum Beispiel aus älterem Excel oder Windows), Python erwartet UTF-8.
- Unter Windows ist die Standardkodierung von
open()oftcp1252, nicht UTF-8. - Binärdaten (Bilder, ZIP) werden als Text gelesen.
- Eine UTF-8-Datei mit BOM (Byte Order Mark) oder UTF-16.
- Mehrfach falsch umkodierte Texte.
Lösungswege
- Kodierung angeben:
open("datei.txt", encoding="utf-8")oderencoding="cp1252"/"latin-1". - Kodierung erkennen: Editor (VS Code: unten rechts),
file -i datei.txt, Bibliothekcharset-normalizer. - Bei BOM:
encoding="utf-8-sig". - Bei Binärdaten im Modus
"rb"öffnen. - Notfalls Fehler ersetzen:
errors="replace"oder"ignore"(verliert Zeichen, nur wenn akzeptabel). - Alles auf UTF-8 vereinheitlichen, Dateien als UTF-8 speichern und im HTML
<meta charset="utf-8">setzen. Bei CSV aus Excel: „CSV UTF-8“ wählen odercp1252lesen.
Mojibake reparieren
Typisches Muster: UTF-8-Text wurde als Latin-1 gelesen. Rückweg in Python: text.encode("latin-1").decode("utf-8"). Hilfreich ist die Bibliothek ftfy. Immer mit Beispielen testen, weil mehrfache Fehlkodierung komplizierter ist.
Siehe auch: ASCII und Zeichensätze, UTF-8 und Zeichenkodierung, ModuleNotFoundError