[Python-de] Problem bei Ausgabe von Unicode-Strings

Christopher Arndt chris at chrisarndt.de
Mo Sep 22 14:27:05 CEST 2014


Am 22.09.2014 um 13:43 schrieb Harald Wenninger:
> * Christopher Arndt tat kund und zu wissen:
> 
>> In ersten Fall kann Python das Encoding der Konsole feststellen (über
>> die TERM Umgebungsvariable), im zweiten Fall nicht, denn der
>> Ausgabestream ist ja keine Konsole, sondern ein File. Also verwendet
>> Python als Default ASCII, was natürlich nicht klappt, weil 'ä' darin
>> nicht vorkommt.
> 
>> Lösung: an den Input/Output-Boundaries immer eingehende Daten explizit
>> nach Unicode dekodieren und auszugebende Strings explizit kodieren (z.B.
>> nach UTF-8 oder den User das Encoding setzen lassen).
> 
> Das heißt, print gibt im Zweifelsfall immer einen ASCII-Bytestring aus?

Nein, das Default-Encoding richtet sich nach der Art des Ausgabestreams.
Für die Konsole kann das ein anderer Default sein, als für Files oder
für das Filesystem (d.h. Datei- und Ordnernamen), je nach Pythonversion
oder Umgebungsvariablen.

Ich habe da selbst auch nicht immer den Überblick und muss im
Zweifelsfalle nachschlagen, aber da gibt es verschiedenen Quellen, wo
das jeweilige Default-Encoding herkommen kann, u.a.
locale.getpreferredencoding(), sys.getdefaultencoding() und
sys.getfilesystemencoding(). Details sollten (hoffentlich) in der von
Harald genannten Dokumentation stehen, wenn nicht an entsprechender
Stelle in der Standard Library Reference, also z.B. u.a. bei
str.decode() und unicode.encode().

> Man muss also "nur" dafür sorgen, dass print immer eine str()-Objekt
> bekommt?
> 
> print u'ä'.encode('utf-8')

Wenn deine Konsole UTF-8-Encoding verwendet, ja. Bei Dateien kannst du
das Encoding für die Ausgabe ja selbst festlegen.


Chris


Mehr Informationen über die Mailingliste python-de