改变Python的默认编码?

11 浏览
0 Comments

改变Python的默认编码?

当我从控制台运行我的应用程序时,Python经常出现“无法编码”和“无法解码”的问题。但是在Eclipse PyDev IDE中,默认字符编码设置为UTF-8,这对我来说是没问题的。

我搜索了一下如何设置默认编码,有人说Python在启动时会删除sys.setdefaultencoding函数,我们不能使用它。

那么,有什么最好的解决方法呢?

0
0 Comments

问题的原因是在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来更改默认编码。

0
0 Comments

问题的出现原因是在尝试将脚本的输出重定向/管道时出现了Unicode编码错误。解决方法是在控制台中导出PYTHONIOENCODING,并运行代码。另外,将LC_CTYPE设置为合理的值也是一个解决方法。在Python3中的一个更大的bug是,PYTHONIOENCODING=utf8不是默认设置。这使得脚本在LC_ALL=C的情况下出现错误。但是,将LC_CTYPE设置为合理的值对于在另一个人的系统上“只工作”的代码分发来说并不是很好。Debian和Redhat操作系统使用C.utf8区域设置来提供更合理的C。glibc正在努力添加这个设置,所以我们不应该责怪Python遵守区域设置。此外,在Heroku Dynos中,默认编码设置为utf8,这会导致令人沮丧的调试经历。在Heroku上解决了这个问题。

0
0 Comments

改变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,参见讨论。

0