如何在Python 3.6中解决UnicodeDecodeError?

Uma*_*air 4 python unicode python-3.x

我从Python 2.7切换到Python 3.6。

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

我通常通过Cron和Terminal运行脚本。

我的python 2.7脚本中出现了UnicodeDecodeError,我解决了这个问题。

# encoding=utf8  
import sys  

reload(sys)  
sys.setdefaultencoding('utf8')
Run Code Online (Sandbox Code Playgroud)

现在在Python 3.6中,它不起作用。我有类似的打印语句print("Here %s" % (myvar)),它会引发错误。我可以通过将其替换为来解决此问题,myvar.encode("utf-8")但我不想用每个print语句编写。

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

有没有更清洁的方法来解决UnicodeDecodeErrorPython 3.6中的问题?

有没有办法告诉Python3在utf-8中打印所有内容?就像我在Python2中所做的一样?

Ala*_*ack 10

听起来您的语言环境已损坏,并且还有另一个bytes-> Unicode问题。您为Python 2.7做的事情是只掩盖了真正的问题的hack(这是您必须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=
Run Code Online (Sandbox Code Playgroud)

locale取决于LANG正确设置。Python有效地用于计算locale出向stdout写入时使用的编码。如果无法解决,则默认为ASCII。

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

如果所有其他方法均失败,则可以随时通过设置来修复Python PYTHONIOENCODING=UTF-8。这将被用作最后的手段,因为您将再次掩盖问题。

如果设置后Python仍然抛出错误,PYTHONIOENCODING请使用stacktrace更新您的问题。您可能正在进行隐式转换。

  • 对于未来的读者,请查看我们在聊天中的对话@Alastair McCormack 如何帮助我解决我的问题。https://chat.stackoverflow.com/rooms/173761/discussion-between-alastair-mccormack-and-umair (5认同)

小智 6

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

ENV LANG C.UTF-8
Run Code Online (Sandbox Code Playgroud)

  • 在控制台中运行 python 之前 `export LANG=en_GB.UTF-8` 暂时修复此问题 (2认同)