我正在运行一个最近的 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
<module 'sys' (built-in)>
>>> sys.setdefaultencoding("UTF-8")
>>> sys.getdefaultencoding()
'UTF-8'
但这种做法似乎不干净。那么,有什么好的方法可以做到这一点呢?
解决方法
而不是更改默认编码 - 这不是一个好主意(参见 mesilliac 的答案) - 我只是sys.stdout
用StreamWriter
这样的包装:
sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout)
有关处理它的小实用程序功能,请参见此要点。