代码之家  ›  专栏  ›  技术社区  ›  Umair Ayub

如何解决python 3.6中的unicodedecodeerror?

  •  2
  • Umair Ayub  · 技术社区  · 6 年前

    我从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") 但我不想每次都用印刷体写。

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

    有更干净的方法解决吗 UnicodeDecodeError Python3.6中的问题?

    有什么办法让蟒蛇3号用utf-8打印所有东西吗?就像我在python2里一样?

    4 回复  |  直到 6 年前
        1
  •  8
  •   Alastair McCormack    6 年前

    听起来你的语言环境坏了 并有其他字节->Unicode问题 是的。你为Python 2.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=
    

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

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

    如果其他方法都失败了,您可以通过设置 PYTHONIOENCODING=UTF-8 .这应该作为最后的手段,因为你将再次掩盖问题。

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

        2
  •  1
  •   Alfe    6 年前

    对于仅限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' 是的。

    所以我想你可能想 类似的东西 en_US.UTF-8 是的。你的终端程序似乎没有做到这一点。

        3
  •  0
  •   Daniel    5 年前

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

    ENV LANG C.UTF-8
    
        4
  •  -2
  •   ananto30    6 年前

    Python 3(包括3.6)已经支持Unicode。这是医生- https://docs.python.org/3/howto/unicode.html

    所以不需要像Python2.7那样强制支持Unicode。试着正常运行代码。如果在读取Unicode文本文件时出错,则需要使用 encoding='utf-8' 读取文件时的参数。

        5
  •  -3
  •   Jakob Sachs    6 年前

    我的意思是你可以编写这样的自定义函数: (我知道不是最理想的)


    import sys
    
    def printUTF8(input):
        print(input.encode("utf-8"))