Я использую недавнюю систему 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)
См. эту суть для небольшой вспомогательной функции, которая обрабатывает это.