Я запускаю последнюю систему 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
Если я делаю следующее в начале script, он работает, хотя:
>>> import sys
>>> reload(sys) # to enable `setdefaultencoding` again
<module 'sys' (built-in)>
>>> sys.setdefaultencoding("UTF-8")
>>> sys.getdefaultencoding()
'UTF-8'
Но этот подход кажется нечистым. Итак, какой хороший способ это сделать?
Обход
Вместо изменения кодировки по умолчанию, которая не является хорошей идеей (см. mesilliac answer) - я просто обертываю sys.stdout
с помощью StreamWriter
следующим образом:
sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout)
См. этот параметр для небольшой функции полезности, которая обрабатывает его.