Unicode in Python-Skripten
Ich habe ein Python-Skript geschrieben, das eine Webseite parst und dabei den angezeigten Text extrahiert. Diesen Text speichere ich als Unicode und gebe ihn anschlieĂźend im auf UTF-8 eingestellten Terminalfenster aus. Das funktioniert auch problemlos; alle Sonderzeichen werden korrekt dargestellt. Wenn ich aber die Ausgabe per Output-Umleitung in einer Datei speichere oder via Pipe an ein zweites Programm weiterleite, bricht das Skript beim ersten Umlaut mit einem UnicodeEncodeError ab.
Ich habe ein Python-Skript geschrieben, das eine Webseite parst und dabei den angezeigten Text extrahiert. Diesen Text speichere ich als Unicode und gebe ihn anschlieĂźend im auf UTF-8 eingestellten Terminalfenster aus. Das funktioniert auch problemlos; alle Sonderzeichen werden korrekt dargestellt. Wenn ich aber die Ausgabe per Output-Umleitung in einer Datei speichere oder via Pipe an ein zweites Programm weiterleite, bricht das Skript beim ersten Umlaut mit einem UnicodeEncodeError ab.
Python versucht, bei Textausgaben die Kodierung von Stdout automatisch zu erkennen und Unicode-Zeichen korrekt auszugeben. Wird der Output auf der Kommandozeile umgeleitet, kann Python die Kodierung nicht mehr erkennen und fällt auf den kleinsten gemeinsamen Nenner – ASCII – zurück. Da ASCII keine Umlaute kennt, lassen diese sich nicht mehr ausgeben, und es kommt zu dem UnicodeEncodeError. Die Variable sys.stdout.encoding speichert die aktuelle Kodierung von Stdout.
Wenn Sie wissen, dass Ihr Skript nur in Unicode-fähigen Umgebungen läuft, können Sie explizit eine Output-Kodierung erzwingen. Da die Variable sys.stdout.encoding nur lesbar ist, müssen Sie dazu einen kleinen Umweg gehen und Stdout in ein StreamWriter-Objekt einpacken. Das geht mit der Zeile
sys.stdout = codecs.getwriter('UTF-8')(sys.stdout)
Danach gibt die Print-Anweisung Unicode-Strings immer UTF-8-kodiert aus. (odi)