EMZETT.
Login

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() oft cp1252, 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

  1. Kodierung angeben: open("datei.txt", encoding="utf-8") oder encoding="cp1252" / "latin-1".
  2. Kodierung erkennen: Editor (VS Code: unten rechts), file -i datei.txt, Bibliothek charset-normalizer.
  3. Bei BOM: encoding="utf-8-sig".
  4. Bei Binärdaten im Modus "rb" öffnen.
  5. Notfalls Fehler ersetzen: errors="replace" oder "ignore" (verliert Zeichen, nur wenn akzeptabel).
  6. 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 oder cp1252 lesen.

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