如何解决 Python 3.6 中的 UnicodeDecodeError?

新手上路,请多包涵

我从 Python 2.7 切换到 Python 3.6。

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

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

我的 Python 2.7 脚本中有 UnicodeDecodeError,我通过这个解决了。

 # encoding=utf8
import sys

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

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

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

有没有更简洁的方法来解决 Python 3.6 中的 UnicodeDecodeError 问题?

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

原文由 Umair Ayub 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 854
2 个回答

听起来您的语言环境已损坏 并且有另一个 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=

locale 取决于 LANG 是否正确设置。 Python 有效地使用 locale 来确定写入标准输出时使用的编码。如果无法解决,则默认为 ASCII。

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

如果一切都失败了,您始终可以通过设置 PYTHONIOENCODING=UTF-8 来修复 Python。这应该作为最后的手段使用,因为您将再次掩盖问题。

如果 Python 在设置 PYTHONIOENCODING 后仍然抛出错误,那么请使用堆栈跟踪更新您的问题。您可能正在进行隐含的转换。

原文由 Alastair McCormack 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

 ENV LANG C.UTF-8

原文由 Daniel 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题