UnicodeEncodeError:在0-5位置“ASCII”编解码器无法编码的字符:顺序不在范围

2019-05-12 03:02发布

这个问题已经在这里有一个答案:

  • Unicode的错误序不在范围内 1回答

我只是试图解码为\ uXXXX为\ uXXXX为\ uXXXX般的字符串。 但是,我得到一个错误:

$ python
Python 2.7.6 (default, Sep  9 2014, 15:04:36) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> print u'\u041e\u043b\u044c\u0433\u0430'.decode('utf-8')
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)

    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)

我是Python的新手。 什么是问题? 谢谢!

Answer 1:

Python是想帮一下忙。 你不能解码 Unicode数据,它已经被解码。 所以Python将首先对数据进行编码 (使用ASCII编码解码器),以获得字节进行解码。 这是一个失败,这隐含的编码。

如果你有Unicode数据,它才有意义编码成UTF-8,不能解码:

>>> print u'\u041e\u043b\u044c\u0433\u0430'
Ольга
>>> u'\u041e\u043b\u044c\u0433\u0430'.encode('utf8')
'\xd0\x9e\xd0\xbb\xd1\x8c\xd0\xb3\xd0\xb0'

如果你想要一个Unicode值,然后使用一个Unicode文本( u'...' )是所有你需要做的。 没有进一步的解码是必要的。

相同的隐式转换发生在其它方向上; 如果你试图编码字节字符串你会触发一个隐含的解码:

>>> u'\u041e\u043b\u044c\u0433\u0430'.encode('utf8').encode('utf8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128)


Answer 2:

您可以设置默认编码UTF-8。

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


文章来源: UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128) [duplicate]