【问题标题】:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128) [duplicate]UnicodeEncodeError:'ascii'编解码器无法编码位置0-5中的字符:序数不在范围内(128)[重复]
【发布时间】:2015-04-17 03:45:06
【问题描述】:

我只是想解码类似 \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 新手。有什么问题?谢谢!

【问题讨论】:

  • 为什么要解码已经解码的数据?
  • 问题是您使用的是 Python 2,在 Unicode 字符串上有一个欺骗性的 .decode 方法。使用python3,问题就会神奇地消失,因为u''.decode 会导致AttributeError: 'str' object has no attribute 'decode'

标签: python python-2.7 utf-8 decode


【解决方案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)

【讨论】:

  • 其实我使用msg = msg + u"@id%s (%s)\n" % (u["id"], u["first_name"].encode('utf8')) print msg代码。它在print 子句中给了我一个错误。
  • @SergiiMatrunchyk:这不是你的问题要问的。您的终端或控制台是否正确配置为处理您尝试打印的字符?
  • @SergiiMatrunchyk:另外,你为什么要 encoding 然后插入一个 unicode 字符串?您将这些值放入 u'...' unicode 对象中,您不应该对正在插值的值进行编码。
  • 根据您运行字符串的进程,您可能需要先清理它。您可以通过以下方式快速运行它来通过编码和解码来做到这一点:string = string.encode("ascii","ignore") string = string.decode("ascii") 这样字符串就可以“清除”不需要的字符。
【解决方案2】:

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

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

【讨论】:

  • 坏主意。对于不懂编码的人来说,这是一个讨厌的、讨厌的黑客攻击:anonbadger.wordpress.com/2015/06/16/…
  • 感谢 Alastair McCormack 的建议
  • 不要不要使用这个cargo cult解决方案。 sys.setdefaultencoding 从模块中删除是有原因的,更改 Python 2 的隐式默认编码可能会破坏依赖正常行为的 3rd-party 库。
  • 尝试太多,最后这个答案救了我!谢谢。 :)
猜你喜欢
  • 2018-06-29
  • 2014-01-22
  • 2011-07-05
  • 1970-01-01
  • 2020-07-26
  • 2017-12-18
  • 1970-01-01
  • 2013-11-18
  • 2016-10-06
相关资源
最近更新 更多