首页 文章

UnicodeDecodeError:'ascii' codec无法解码位置1的字节0xef

提问于
浏览
93

我'm having a few issues trying to encode a string to UTF-8. I'尝试了很多东西,包括使用 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)

16 回答

  • -2

    看起来你的字符串被编码为 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'
    
  • 1

    这适用于ubuntu 15.10:

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

    在我的情况下,它是由我的Unicode文件保存带有“BOM”引起的 . 为了解决这个问题,我使用BBEdit破解了打开文件并选择了“另存为...”选择编码“Unicode(UTF-8)”而不是它带来的“Unicode(UTF-8,带BOM)” “

  • -2

    我得到了相同类型的错误,我发现控制台无法用另一种语言显示字符串 . 因此,我进行了以下代码更改,将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 ])
    
  • 6

    BOM,对我来说经常是BOM

    vi文件,使用

    :set nobomb
    

    并保存 . 这几乎总是在我的情况下修复它

  • 8

    我有相同的错误,URL包含非ascii字符(值大于128的字节)

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

    为我工作,在Python 2.7中,我认为这个赋值在 str 内部表示中改变了'something' - 即,它强制正确解码 url 中支持的字节序列,最后将字符串放入utf-8 str 并带有所有魔法在正确的地方 . Python中的Unicode对我来说是黑魔法 . 希望有用

  • 0

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

    在linux中:

    export PYTHONIOENCODING=utf-8
    

    所以 sys.stdout.encoding 没关系 .

  • 20

    这与您的终端编码未设置为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变体的文档,了解如何使此变更永久化 .

  • -1

    尝试:

    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' ,这是正确的 .

    所以你的问题必须在某个地方,可能如果你试图用它做某事是有隐式转换(可能是打印,写入流...)

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

  • 0

    我在1月17日对于mata的评论和Nick Craig-Wood的演示 . 您已正确解码字符串 . 问题在于 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的语言相关环境变量发送到远程主机 . 它会导致_1783907问题 .

  • 23

    尝试在脚本开头将系统默认编码设置为 utf-8 ,以便使用该编码对所有字符串进行编码 .

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

    我的终端没问题 . 上面的答案帮助我找到了正确的方向,但直到我添加 'ignore' 它才对我有用:

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

    如下面的评论所示,这可能会导致不良后果 . OTOH它也可以很好地完成这个技巧,让事情发挥作用,而你不关心失去一些角色 .

  • 1

    可以在脚本顶部使用下面的代码,如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)
    

    谢谢 .

  • 2

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

  • 1

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

相关问题