我正在运行一个最新的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作为文件系统编码,但默认编码仍然是ASCII:-(
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.getfilesystemencoding()
'UTF-8'
我原以为最好(干净)的方法是设置PYTHONIOENCODING环境变量。但似乎Python会忽略它。至少在我的系统上,即使设置了环境变量,我仍然会得到默认编码ascii。
# 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)
请查看此代码片段,其中包含一个小型实用函数,可处理此问题。
PYTHONIOENCODING
并没有被忽略;正如其名称所示,它会影响标准输入/输出/错误的编码(参见https://docs.python.org/2/using/cmdline.html#environment-variables),而这不是您使用[`sys.getdefaultencoding()`](https://docs.python.org/2/library/sys.html#sys.getdefaultencoding)检查的内容。 - musiphilpython -c 'import sys; print sys.stdout.encoding'
输出UTF-8
,而PYTHONIOENCODING='C' python -c 'import sys; print sys.stdout.encoding'
输出C
。 - musiphilsys.stdout.encoding
。安装不正确的区域设置可能会导致将sys.stdout.encoding
设置为ASCII
。$ locale
应该无错误返回。 - Alastair McCormack