如何更改Python的默认编码?

185 投票
14 回答
395295 浏览
提问于 2025-04-15 19:21

我在用 Python 运行我的应用时,经常遇到“无法编码”和“无法解码”的问题,尤其是在控制台里。不过在 EclipsePyDev 开发环境中,默认的字符编码是 UTF-8,这样我就没问题了。

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

那么,解决这个问题的最好办法是什么呢?

14 个回答

53

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 这个方法,作者是 @EOL。

B) 控制 stdin.encodingstdout.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),或者两者都用!

99

如果你在尝试将你的脚本输出重定向或管道时遇到这个错误:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128)

只需要在控制台中设置一下 PYTHONIOENCODING,然后再运行你的代码就可以了。

export PYTHONIOENCODING=utf8
176

这里有一个更简单的方法(小技巧),可以让你重新获得被从 sys 中删除的 setdefaultencoding() 函数:

import sys
# sys.setdefaultencoding() does not exist, here!
reload(sys)  # Reload does the trick!
sys.setdefaultencoding('UTF8')

(注意:对于 Python 3.4 及以上版本,reload()importlib 库中。)

不过,这样做并不安全,因为这显然是个小技巧,sys.setdefaultencoding() 是在 Python 启动时故意从 sys 中移除的。重新启用它并改变默认编码 可能会导致依赖 ASCII 作为默认编码的代码出现问题(这些代码可能是第三方的,通常修复起来既困难又危险)。

附注:这个小技巧在 Python 3.9 中似乎不再有效。

撰写回答