Wie drucke ich in Python <3 UTF-8-kodierten Text auf die Konsole?
Ich verwende ein aktuelles Linux-System, bei dem alle meine Ländereinstellungen UTF-8 sind:
LANG=de_DE.UTF-8
LANGUAGE=
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
...
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=
Jetzt möchte ich UTF-8-codierten Inhalt in die Konsole schreiben.
Im Moment verwendet Python UTF-8 für die FS-Codierung, bleibt jedoch bei ASCII für die Standardcodierung :-(
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.getfilesystemencoding()
'UTF-8'
Ich dachte, der beste (saubere) Weg, dies zu tun, war das Einstellen derPYTHONIOENCODING
Umgebungsvariable. Aber es scheint, dass Python es ignoriert. Zumindest auf meinem System bekomme ich immerascii
als Standardkodierung, auch nach dem Einstellen derenvvar.
# tried this in ~/.bashrc and ~/.profile (also sourced them)
# and on the commandline before running python
export PYTHONIOENCODING=UTF-8
Wenn ich zu Beginn eines Skripts Folgendes mache, funktioniert es trotzdem:
>>> import sys
>>> reload(sys) # to enable `setdefaultencoding` again
<module 'sys' (built-in)>
>>> sys.setdefaultencoding("UTF-8")
>>> sys.getdefaultencoding()
'UTF-8'
Aber dieser Ansatzscheint unsauber. Was ist also ein guter Weg, um dies zu erreichen?
UmgehungAnstatt die Standardkodierung zu ändern - das istkeine gute Idee (Siehe die Antwort von Mesilliac.) - Ich wickle nursys.stdout
mit einerStreamWriter
so was:
sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout)
Sehendieser Kern für eine kleine Utility-Funktion, die damit umgeht.