【发布时间】:2018-12-29 16:42:54
【问题描述】:
我正在运行一个最新的 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 的回答) - 我只是用 StreamWriter 包装 sys.stdout 像这样:
sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout)
请参阅this gist 了解处理它的小实用函数。
【问题讨论】:
-
也许这会起作用:#!/usr/bin/env python # -- coding: utf-8 --
-
记得把它放在源文件的最前面。
-
这只影响 Python 如何解释源代码中的文字字符串。 IO 编码仍然是 ASCII。
-
PYTHONIOENCODING不会被忽略;只是,顾名思义,它是affects the encoding used for stdin/stdout/stderr,这不是您使用sys.getdefaultencoding()检查的内容。 -
@Brutus:你是如何测试它不起作用的?它似乎对我有用。
python -c 'import sys; print sys.stdout.encoding'提供UTF-8,PYTHONIOENCODING='C' python -c 'import sys; print sys.stdout.encoding'提供C。
标签: python shell encoding utf-8 ascii