Jak wydrukować tekst zakodowany w UTF-8 na konsoli w Pythonie <3?
Używam najnowszego systemu Linux, gdzie wszystkie moje ustawienia narodowe to UTF-8:
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=
Teraz chcę napisać zawartość zakodowaną w UTF-8 do konsoli.
W tej chwili Python używa UTF-8 do kodowania FS, ale trzyma się ASCII dla domyślnego kodowania :-(
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.getfilesystemencoding()
'UTF-8'
Myślałem, że najlepszym (czystym) sposobem na to było ustawieniePYTHONIOENCODING
Zmienna środowiskowa. Ale wydaje się, że Python go ignoruje. Przynajmniej w moim systemie wciąż się dostajęascii
jako domyślne kodowanie, nawet po ustawieniuenvvar.
# tried this in ~/.bashrc and ~/.profile (also sourced them)
# and on the commandline before running python
export PYTHONIOENCODING=UTF-8
Jeśli na początku skryptu wykonam następujące czynności, działa to jednak:
>>> import sys
>>> reload(sys) # to enable `setdefaultencoding` again
<module 'sys' (built-in)>
>>> sys.setdefaultencoding("UTF-8")
>>> sys.getdefaultencoding()
'UTF-8'
Ale to podejściewydaje się nieczysty. Więc jaki jest dobry sposób, aby to osiągnąć?
Obejście problemuZamiast zmieniać domyślne kodowanie - czyliniezbyt dobry pomysł (patrz odpowiedź mesilliaca) - po prostu zawijamsys.stdout
zStreamWriter
lubię to:
sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout)
Widziećten sens dla małej funkcji użyteczności, która to obsługuje.