这个问题在这里已有答案:
我刚刚将我的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()
从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
设置的其他内容(区域设置?)。