-1

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

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

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

python 2中存在相同的问题(在两个平台上),并通过这个解决了

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

sys.getdefaultencoder()将from的值更改asciiutf-8

但是现在在 python3sys.getdefaultencoder()中已经utf-8默认了(为什么我们不应该在 py 脚本中使用 sys.setdefaultencoding("utf-8")?)所以我对导致这种行为差异的原因一无所知。

所以:

  • 我应该寻找什么来了解为什么两个平台都有不同的编码默认值?
  • 我该如何解决这个日志记录?
4

1 回答 1

0

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

这可以通过将环境值设置LC_CTYPEen_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

于 2019-02-17T03:13:37.607 回答