Как вывести текст в кодировке UTF -8 на консоль в Python < 3?

Я использую недавнюю систему Linux, где все мои локали 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=

Теперь я хочу записать содержимое в кодировке UTF -8 на консоль.

Прямо сейчас Python использует UTF -8 для кодировки FS, но придерживается ASCII для кодировки по умолчанию :-(

>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.getfilesystemencoding()
'UTF-8'

. Я думал, что лучший (чистый )способ сделать это — установить PYTHONIOENCODINGпеременную окружения. Но похоже, что Python игнорирует это. По крайней мере, в моей системе я продолжаю получать asciiв качестве кодировки по умолчанию, даже после установки envvar .

# tried this in ~/.bashrc and ~/.profile (also sourced them)
# and on the commandline before running python
export PYTHONIOENCODING=UTF-8

Если я сделаю следующее в начале скрипта, это сработает:

>>> import sys
>>> reload(sys)  # to enable `setdefaultencoding` again

>>> sys.setdefaultencoding("UTF-8")
>>> sys.getdefaultencoding()
'UTF-8'

Но такой подход кажется нечистым . Итак, как это сделать?

Обходной путь

Вместо изменения кодировки по умолчанию -, что не очень хорошая идея(см. ответ Месильяка)-Я просто заворачиваю sys.stdoutв StreamWriterвот так:

sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout)

См. эту суть для небольшой вспомогательной функции, которая обрабатывает это.

49
задан Brutus 30 June 2014 в 01:00
поделиться