改变Python的默认编码?
问题的原因是在Python中更改默认编码的操作被删除了,因此无法直接使用setdefaultencoding()
函数来更改默认编码。在Python启动时,sys.setdefaultencoding()
被有意地从sys
中删除,这是一个hack的方法,通过重新加载sys
模块来恢复setdefaultencoding()
函数,并将默认编码设置为UTF8。然而,这种方法是不安全的,因为它可能会破坏依赖于ASCII作为默认编码的代码。此外,该hack在Python 3.9中似乎不再起作用。
解决方法是设置LC_CTYPE
环境变量来更改默认编码。在一个应用程序中,可以检查LC_CTYPE
是否设置正确,并给出有意义的错误信息。另外,还提到了LC_CTYPE
环境变量对Python解释器的影响。
需要注意的是,使用sys.setdefaultencoding()
始终是不鼓励的,并且在Python 3中,默认编码被硬编码为UTF-8,更改它会引发错误。
虽然hack方法可以实现更改默认编码,但它是不安全的,并且可能会破坏现有的代码。更好的方法是通过设置环境变量LC_CTYPE
来更改默认编码。
问题的出现原因是在尝试将脚本的输出重定向/管道时出现了Unicode编码错误。解决方法是在控制台中导出PYTHONIOENCODING,并运行代码。另外,将LC_CTYPE设置为合理的值也是一个解决方法。在Python3中的一个更大的bug是,PYTHONIOENCODING=utf8不是默认设置。这使得脚本在LC_ALL=C的情况下出现错误。但是,将LC_CTYPE设置为合理的值对于在另一个人的系统上“只工作”的代码分发来说并不是很好。Debian和Redhat操作系统使用C.utf8区域设置来提供更合理的C。glibc正在努力添加这个设置,所以我们不应该责怪Python遵守区域设置。此外,在Heroku Dynos中,默认编码设置为utf8,这会导致令人沮丧的调试经历。在Heroku上解决了这个问题。
改变Python的默认编码?
A) 控制sys.getdefaultencoding()的输出:
python -c 'import sys; print(sys.getdefaultencoding())'
ascii
然后
echo "import sys; sys.setdefaultencoding('utf-16-be')" > sitecustomize.py
和
PYTHONPATH=".:$PYTHONPATH" python -c 'import sys; print(sys.getdefaultencoding())'
utf-16-be
你可以将sitecustomize.py放在PYTHONPATH的更高位置。
你也可以尝试使用reload(sys).setdefaultencoding。
B) 控制stdin.encoding和stdout.encoding,你需要设置PYTHONIOENCODING:
python -c 'import sys; print(sys.stdin.encoding, sys.stdout.encoding)'
ascii ascii
然后
PYTHONIOENCODING="utf-16-be" python -c 'import sys; print(sys.stdin.encoding, sys.stdout.encoding)'
utf-16-be utf-16-be
最后:你可以同时使用A)和B)或者两者都使用!(仅适用于python2)另外一个有趣的是在上述代码中添加from __future__ import unicode_literals,参见讨论。