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

时间:2012-05-12 07:39:53

标签: python unicode utf-8

我在尝试将字符串编码为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)

16 个答案:

答案 0 :(得分:69)

这与终端的编码未设置为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 :(得分:24)

尝试:

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

所以你的问题必须在某个地方,如果你试图对它做一些事情就会发生隐式转换(可能是打印,写入流......)

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

答案 2 :(得分:21)

我在+1 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()

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

答案 3 :(得分:8)

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

当此文件包含一行时:

SendEnv LANG LC_*

通过在行首添加#来评论它。这可能有所帮助。

使用此行,ssh会将您的PC的语言相关环境变量发送到远程主机。它会导致很多问题。

答案 4 :(得分:8)

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

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

答案 5 :(得分:4)

我的终端没问题。上面的答案帮助我找到了正确的方向,但在我添加'ignore'之前它对我不起作用:

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

如下面的评论所示,这可能会导致意外结果。 OTOH它也可以很好地完成这个技巧,让事情变得有效,而你却不在乎失去一些角色。

答案 6 :(得分:3)

可以在脚本顶部使用以下代码,建议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 :(得分:1)

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

答案 8 :(得分:1)

这适用于ubuntu 15.10:

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

答案 9 :(得分:1)

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

答案 10 :(得分:0)

我遇到了相同类型的错误,我发现控制台无法以其他语言显示字符串。因此,我进行了以下代码更改,将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 ])

答案 11 :(得分:0)

BOM,对我来说经常是BOM

vi文件,使用

:set nobomb

并保存。这几乎总是在我的案例中修复它

答案 12 :(得分:-1)

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

在linux中

export PYTHONIOENCODING=utf-8

所以sys.stdout.encoding没问题。

答案 13 :(得分:-1)

我也遇到了同样的错误,URL包含非ASCII字符(值大于128的字节)

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

在Python 2.7中为我工作,我认为此分配更改了str内部表示形式中的“某些内容”,即,它强制对url中支持的字节序列进行正确的解码,最后将所有字符串放在正确位置的 utf-8 str中。 Python中的Unicode对我来说是黑魔法。 希望有用

答案 14 :(得分:-2)

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

答案 15 :(得分:-2)

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