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
.
设置的其他内容(语言环境?)
我刚刚将我的 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
.