【问题标题】:UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 1UnicodeDecodeError:“ascii”编解码器无法解码位置 1 的字节 0xef
【发布时间】:2012-05-20 16:10:15
【问题描述】:

我在尝试将字符串编码为 UTF-8 时遇到了一些问题。我尝试了很多东西,包括使用string.encode('utf-8')unicode(string),但我得到了错误:

UnicodeDecodeError:“ascii”编解码器无法解码位置 1 的字节 0xef:序数不在范围内 (128)

这是我的字符串:

(。・ω・。)ノ

我不知道出了什么问题,知道吗?

编辑:问题是按原样打印字符串不能正确显示。另外,当我尝试转换它时出现这个错误:

Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
>>> s1 = s.decode('utf-8')
>>> print s1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in range(128)

【问题讨论】:

  • 这只是一个正常插入的字符串。当我尝试打印它时也会发生同样的情况。
  • 我在 pip install 时遇到了同样的情况,并从这里修复它:[install some devel][1] [1]: stackoverflow.com/questions/17931726/…

标签: python unicode utf-8


【解决方案1】:

这与您的终端编码未设置为 UTF-8 有关。这是我的终端

$ echo $LANG
en_GB.UTF-8
$ python
Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
>>> s1 = s.decode('utf-8')
>>> print s1
(。・ω・。)ノ
>>> 

在我的终端上,该示例适用于上述示例,但如果我摆脱 LANG 设置,它将无法正常工作

$ unset LANG
$ python
Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
>>> s1 = s.decode('utf-8')
>>> print s1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in range(128)
>>> 

请查阅您的 linux 变体的文档,了解如何使此更改永久生效。

【讨论】:

  • 缺少语言环境也可能是一个原因。要安装它们,请运行 sudo apt-get install language-pack-desudo locale-gen de_DE.UTF-8(对于德语区域设置)。
  • 对我来说,缺少的环境变量是LC_ALL,最简单的修复它的值是C.UTF-8
【解决方案2】:

尝试:

string.decode('utf-8')  # or:
unicode(string, 'utf-8')

编辑:

'(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'.decode('utf-8') 给出u'(\uff61\uff65\u03c9\uff65\uff61)\uff89',这是正确的。

所以你的问题一定出在其他地方,如果你试图用它做一些事情,那么有一个隐式转换正在进行(可能是打印,写入流......)

要说更多,我们需要看一些代码。

【讨论】:

  • 两者都返回UnicodeEncodeError: 'charmap' codec can't encode characters in position 1-5: character maps to &lt;undefined&gt;
  • '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
  • 我要做的就是以原始格式打印原始字符串,但我得到了(´¢í´¢Ñ¤ë´¢Ñ´¢í)´¥ë
  • string 是 utf8 编码的。如果你打印它,它只是将字节写入输出流,如果你的终端没有将它解释为 utf8,你最终会得到垃圾。使用 decode 将其转换为 unicode,然后您可以将 encode 再次转换为您的终端可以理解的编码。
【解决方案3】:

我对 mata 在https://stackoverflow.com/a/10561979/1346705 的评论和 Nick Craig-Wood 的演示 +1。您已正确解码字符串。问题在于 print 命令,因为它将 Unicode 字符串转换为控制台编码,并且控制台无法显示该字符串。尝试将字符串写入文件并使用一些支持 Unicode 的不错的编辑器查看结果:

import codecs

s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
s1 = s.decode('utf-8')
f = codecs.open('out.txt', 'w', encoding='utf-8')
f.write(s1)
f.close()

然后你会看到(。・ω・。)ノ

【讨论】:

    【解决方案4】:

    如果您在远程主机上工作,请在您的本地PC上查看/etc/ssh/ssh_config

    当这个文件包含一行时:

    SendEnv LANG LC_*
    

    在行首添加# 将其注释掉。这可能会有所帮助。

    通过这一行,ssh 将您 PC 的语言相关环境变量发送到 remote 主机。它会导致很多问题。

    【讨论】:

    • 谢谢!这些解决了我用 ansible 和 vagrant 安装 pip 包的问题
    【解决方案5】:

    尝试在脚本开始时将系统默认编码设置为utf-8,以便所有字符串都使用该编码。

    # coding: utf-8
    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    

    【讨论】:

    【解决方案6】:

    按照Andrei Krasutski 的建议,可以在脚本顶部使用以下代码。

    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    

    但我建议您在脚本的最顶部添加 # -*- coding: utf-8 -* 行。

    当我尝试执行 basic.py 时,忽略它会引发以下错误。

    $ python basic.py
      File "01_basic.py", line 14
    SyntaxError: Non-ASCII character '\xd9' in file basic.py on line 14, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
    

    以下是basic.py 中的代码,它会引发上述错误。

    有错误的代码

    from pylatex import Document, Section, Subsection, Command, Package
    from pylatex.utils import italic, NoEscape
    
    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    
    def fill_document(doc):
        with doc.create(Section('ِش سثؤفهخى')):
            doc.append('إخع ساخعمي شمصشغس سحثشن فاث فقعفا')
            doc.append(italic('فشمهؤ ؤخىفثىفس شقث شمسخ ىهؤث'))
    
            with doc.create(Subsection('آثص ٍعلاسثؤفهخى')):
                doc.append('بشةخعس ؤقشئغ ؤاشقشؤفثقس: $&#{}')
    
    
    if __name__ == '__main__':
        # Basic document
        doc = Document('basic')
        fill_document(doc)
    

    然后我在最顶部添加# -*- coding: utf-8 -*- 行并执行。它奏效了。

    代码没有错误

    # -*- coding: utf-8 -*-
    from pylatex import Document, Section, Subsection, Command, Package
    from pylatex.utils import italic, NoEscape
    
    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    
    def fill_document(doc):
        with doc.create(Section('ِش سثؤفهخى')):
            doc.append('إخع ساخعمي شمصشغس سحثشن فاث فقعفا')
            doc.append(italic('فشمهؤ ؤخىفثىفس شقث شمسخ ىهؤث'))
    
            with doc.create(Subsection('آثص ٍعلاسثؤفهخى')):
                doc.append('بشةخعس ؤقشئغ ؤاشقشؤفثقس: $&#{}')
    
    
    if __name__ == '__main__':
        # Basic document
        doc = Document('basic')
        fill_document(doc)
    

    谢谢。

    【讨论】:

    【解决方案7】:

    我的终端没有问题。以上答案帮助我找到了正确的方向,但直到我添加了'ignore'

    fix_encoding = lambda s: s.decode('utf8', 'ignore')
    

    如以下评论所示,这可能会导致不良结果。 OTOH,它也可以很好地发挥作用,让事情正常进行,而且你不在乎失去一些角色。

    【讨论】:

    • 这是错误的,你强迫你的编码 lambda 函数忽略编码本身,这意味着你正在丢失字符。
    • 这解决了我的问题,我不知道原始编码并且我不在乎丢失一些字符。
    【解决方案8】:

    这适用于 ubuntu 15.10:

    sudo locale-gen "en_US.UTF-8"
    sudo dpkg-reconfigure locales
    

    【讨论】:

      【解决方案9】:

      看起来你的字符串被编码为utf-8,那么到底是什么问题?或者你想在这里做什么..?

      Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
      [GCC 4.6.3] on linux2
      Type "help", "copyright", "credits" or "license" for more information.
      >>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
      >>> s1 = s.decode('utf-8')
      >>> print s1
      (。・ω・。)ノ
      >>> s2 = u'(。・ω・。)ノ'
      >>> s2 == s1
      True
      >>> s2
      u'(\uff61\uff65\u03c9\uff65\uff61)\uff89'
      

      【讨论】:

      • 按原样打印原始字符串会得到(´¢í´¢Ñ¤ë´¢Ñ´¢í)´¥ë,我希望它能够正确编码。
      【解决方案10】:

      就我而言,这是由于我的 Unicode 文件与“BOM”一起保存造成的。为了解决这个问题,我使用 BBEdit 打开文件,并选择了“另存为...”来选择编码“Unicode (UTF-8)”,而不是“Unicode (UTF-8, with BOM)”。 "

      【讨论】:

        【解决方案11】:

        我遇到了相同类型的错误,我发现控制台无法以另一种语言显示字符串。因此,我进行了以下代码更改以将 default_charset 设置为 UTF-8。

        data_head = [('\x81\xa1\x8fo\x89\xef\x82\xa2\x95\xdb\x8f\xd8\x90\xa7\x93x\x81\xcb3\x8c\x8e\x8cp\x91\xb1\x92\x86(\x81\x86\x81\xde\x81\x85)\x81\xa1\x8f\x89\x89\xf1\x88\xc8\x8aO\x81A\x82\xa8\x8b\xe0\x82\xcc\x90S\x94z\x82\xcd\x88\xea\x90\xd8\x95s\x97v\x81\xa1\x83}\x83b\x83v\x82\xcc\x82\xa8\x8e\x8e\x82\xb5\x95\xdb\x8c\xaf\x82\xc5\x8fo\x89\xef\x82\xa2\x8am\x92\xe8\x81\xa1', 'shift_jis')]
        default_charset = 'UTF-8' #can also try 'ascii' or other unicode type
        print ''.join([ unicode(lin[0], lin[1] or default_charset) for lin in data_head ])
        

        【讨论】:

          【解决方案12】:

          这是最好的答案: https://stackoverflow.com/a/4027726/2159089

          在 Linux 中:

          export PYTHONIOENCODING=utf-8
          

          所以sys.stdout.encoding 没问题。

          【讨论】:

            【解决方案13】:

            BOM,对我来说经常是 BOM

            vi 文件,使用

            :set nobomb
            

            并保存。在我的情况下,这几乎总是能解决它

            【讨论】:

              【解决方案14】:

              我遇到了同样的错误,网址包含非 ascii 字符(值 > 128 的字节)

              url = url.decode('utf8').encode('utf-8')
              

              为我工作,在 Python 2.7 中,我想这个赋值改变了 str 内部表示中的“某些东西”——即,它强制正确解码 url 中的支持字节序列,最后将字符串放入一个 utf-8 str,所有的魔法都在正确的地方。 Python 中的 Unicode 对我来说是黑魔法。 希望有用

              【讨论】:

                【解决方案15】:

                我用 'ENGINE': 'django.db.backends.mysql' 解决了在文件 settings.py 中更改的问题,不要使用 'ENGINE': 'mysql.connector.django',

                【讨论】:

                • @rayryeng 你能解释一下你编辑的原因吗?它似乎完全改变了 OP 所写内容的含义,从推荐特定设置到推荐 反对
                • @AndrewMedico - 我很抱歉。我看到这个帖子和另一个帖子非常相似,所以我相信它们是一样的。我会回来的。
                【解决方案16】:

                只需使用str() 将文本显式转换为字符串。为我工作。

                【讨论】:

                  猜你喜欢
                  • 2016-02-13
                  • 2021-08-08
                  • 2013-10-16
                  • 2015-01-14
                  • 2014-08-12
                  • 2014-09-06
                  • 1970-01-01
                  • 2018-01-11
                  相关资源
                  最近更新 更多