我正在运行一个最新的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=
Run Code Online (Sandbox Code Playgroud)
现在我想将UTF-8编码的内容写入控制台.
现在Python使用UTF-8进行FS编码,但坚持使用ASCII作为默认编码:-(
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.getfilesystemencoding()
'UTF-8'
Run Code Online (Sandbox Code Playgroud)
我认为最好(干净)的方法是设置PYTHONIOENCODING环境变量.但似乎Python忽略了它.至少在我的系统上ascii,即使在设置envvar之后,我仍然保持默认编码.
# tried this in ~/.bashrc and ~/.profile (also sourced them)
# and on the commandline before running python
export PYTHONIOENCODING=UTF-8
Run Code Online (Sandbox Code Playgroud)
如果我在脚本开头执行以下操作,它可以工作:
>>> import sys
>>> reload(sys) # to enable `setdefaultencoding` again
<module 'sys' (built-in)>
>>> sys.setdefaultencoding("UTF-8")
>>> sys.getdefaultencoding()
'UTF-8'
Run Code Online (Sandbox Code Playgroud)
但这种做法似乎不洁净.那么,实现这一目标的好方法是什么?
而不是更改默认编码 - 这不是一个好主意(请参阅mesilliac的答案) - 我只是sys.stdout用StreamWriter …
启动cygwin shell后,它只是位于错误的主目录中:
xfire@codingme.com ~
$ pwd
/cygdrive/c/Users/xfire
Run Code Online (Sandbox Code Playgroud)
但它曾经是/ home/xfire
xfire@codingme.com /etc
$ cat passwd | grep xfire
xfire:unused:22773:10513:U-CORP\xfire,S-1-5-21-527237240-725345543-682003330-12773:/home/xfire:/bin/bash
Run Code Online (Sandbox Code Playgroud)
并且/ home/xfire中的.bashrc没有被执行,即使我将它复制到/ cygdrive/c/Users/xfire,它也不起作用!