如何解决Python 3.6中的UnicodeDecodeError?

2024-04-24 02:43:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我从Python2.7切换到Python3.6。

我有处理一些非英语内容的脚本。

我通常通过Cron和终端运行脚本。

我的Python2.7脚本中有一个UnicodedeCoderror,我通过这个解决了这个问题。

# encoding=utf8  
import sys  

reload(sys)  
sys.setdefaultencoding('utf8')

现在在Python3.6中,它不起作用。我有像print("Here %s" % (myvar))这样的打印语句,它会抛出错误。我可以通过将它替换为myvar.encode("utf-8")来解决这个问题,但是我不想用每个print语句来编写。

我在我的终端上做了PYTHONIOENCODING=utf-8,但我仍然有这个问题。

Python 3.6中是否有更干净的方法来解决UnicodeDecodeError问题?

有没有办法让Python3号用utf-8打印所有东西?就像我在Python2里一样?


Tags: import脚本终端内容sys语句utf8reload
3条回答

对于仅限Python的解决方案,必须重新创建sys.stdout对象:

import sys, codecs
sys.stdout = codecs.getwriter('utf-8')(sys.stdout.detach())

在此之后,正常的print("hello world")应该自动编码为UTF-8。

但是您应该尝试找出为什么您的终端设置为如此奇怪的编码(Python只是尝试采用这种编码)。也许你的操作系统配置错了。

编辑:在我的测试中,取消设置env变量LANG为我的stdout编码生成了这个奇怪的设置:

LANG= python3
import sys
sys.stdout.encoding

打印的'ANSI_X3.4-1968'

所以我想您可能想将LANG设置为 en_US.UTF-8。你的终端程序似乎没有做到这一点。

我在基于Ubuntu 18.04的Docker容器中使用Python时遇到了这个问题。 这似乎是一个区域设置问题,通过在Dockerfile中添加以下内容解决了该问题:

ENV LANG C.UTF-8

听起来您的区域设置已断开并有另一个字节->;Unicode问题。你对Python2.7所做的一切只是掩盖了真正的问题(这就是为什么你必须reload sys才能让它工作的原因)。

要修复您的区域设置,请尝试从命令行键入locale。它应该看起来像:

LANG=en_GB.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_GB.UTF-8"
LC_TIME="en_GB.UTF-8"
LC_COLLATE="en_GB.UTF-8"
LC_MONETARY="en_GB.UTF-8"
LC_MESSAGES="en_GB.UTF-8"
LC_ALL=

locale取决于LANG设置是否正确。Python有效地使用locale来计算在写入stdout时使用什么编码。如果无法解决,则默认为ASCII。

您应该首先尝试修复您的区域设置。如果出现locale错误,请确保已为您所在的地区安装了正确的语言包。

如果所有其他操作都失败,您可以通过设置PYTHONIOENCODING=UTF-8来修复Python。这应该作为最后的手段,因为你将再次掩盖问题。

如果Python在设置PYTHONIOENCODING之后仍然抛出错误,那么请使用stacktrace更新您的问题。很有可能你有一个隐含的转换正在进行。

相关问题 更多 >