我从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里一样?
对于仅限Python的解决方案,必须重新创建
sys.stdout
对象:在此之后,正常的
print("hello world")
应该自动编码为UTF-8。但是您应该尝试找出为什么您的终端设置为如此奇怪的编码(Python只是尝试采用这种编码)。也许你的操作系统配置错了。
编辑:在我的测试中,取消设置env变量
LANG
为我的stdout编码生成了这个奇怪的设置:打印的
'ANSI_X3.4-1968'
。所以我想您可能想将
LANG
设置为en_US.UTF-8
。你的终端程序似乎没有做到这一点。我在基于Ubuntu 18.04的Docker容器中使用Python时遇到了这个问题。 这似乎是一个区域设置问题,通过在Dockerfile中添加以下内容解决了该问题:
听起来您的区域设置已断开并有另一个字节->;Unicode问题。你对Python2.7所做的一切只是掩盖了真正的问题(这就是为什么你必须
reload sys
才能让它工作的原因)。要修复您的区域设置,请尝试从命令行键入
locale
。它应该看起来像:locale
取决于LANG
设置是否正确。Python有效地使用locale
来计算在写入stdout时使用什么编码。如果无法解决,则默认为ASCII。您应该首先尝试修复您的区域设置。如果出现
locale
错误,请确保已为您所在的地区安装了正确的语言包。如果所有其他操作都失败,您可以通过设置
PYTHONIOENCODING=UTF-8
来修复Python。这应该作为最后的手段,因为你将再次掩盖问题。如果Python在设置
PYTHONIOENCODING
之后仍然抛出错误,那么请使用stacktrace更新您的问题。很有可能你有一个隐含的转换正在进行。相关问题 更多 >
编程相关推荐