python3 登录到控制台时出现 UnicodeDecodeError

python3 UnicodeDecodeError while logging to console

我刚刚将我的 webapp 移植到 python 3. 我在我的 Mac 中开发并部署在 CentOS 服务器中。我发现许多 UnicodeDecodeError 在我的本地测试环境中没有发生,但它们出现在部署服务器中(当然 :D )

我通过在打开文件时指定编码来修复其中的大部分问题。但是,有一个地方我不知道如何指定编码,它在日志记录中。我仍然收到如下错误:

UnicodeEncodeError: 'ascii' codec can't encode character '\xab' in position 85: ordinal not in range(128)

python2 中存在相同的问题(在两个平台中),并已通过此

解决
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

这将 sys.getdefaultencoder() 的值从 ascii 更改为 utf-8

但现在 python3 sys.getdefaultencoder() 默认情况下已经 utf-8 ( Why should we NOT use sys.setdefaultencoding("utf-8") in a py script? ) 所以我不知道是什么导致了这种行为差异。

所以:

我在这里找到了答案Python3 UnicodeDecodeError。让我展开:

这可以通过将环境值 LC_CTYPE 设置为 en_US.UTF-8 而不是 UTF-8 来解决。这可以在 .bashrc:

中设置

export LC_CTYPE=en_US.UTF-8

奇怪的是,我的 mac 和部署服务器都有 LC_CTYPE=UTF-8 并且在我的 mac 中它正常工作,但在部署服务器中我需要将其设置为 en_US.UTF-8 否则它不会工作。

但这似乎是我的部署服务器的一个奇怪的配置,因为如果我将它设置为 UTF-8 它会这样抱怨:

$ export LC_CTYPE=UTF-8
bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory

(我的mac没有抱怨)。

很明显 python 不是直接读取 LC_CTYPE 而是读取通过设置 LC_CTYPE.

设置的其他内容(语言环境?)