unicode().decode('utf-8', 'ignore')引发UnicodeEncodeError错误

48
这里是代码:
>>> z = u'\u2022'.decode('utf-8', 'ignore')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'latin-1' codec can't encode character u'\u2022' in position 0: ordinal not in range(256)

为什么在使用.decode()时会出现UnicodeEncodeError错误?
为什么在使用'ignore'时会引发任何错误?

1
请注意,这种情况不会发生在Python 3中。在Python 3中,运行该代码将会出现以下错误:AttributeError: 'str' object has no attribute 'decode'。这是Python 3的优点之一:它强制区分字符串/Unicode对象和字节对象。您可以使用decode将字符串转换为字节对象,使用encode将字节对象转换为字符串,并且更容易理解decodeencode之间的区别。 - Flimm
3个回答

66

当我第一次开始使用Python字符串和Unicode时,我花了一些时间才理解"decode"和"encode"的专业术语,所以以下是我的帖子,可能会对您有所帮助:here


将一个常规的字节字符串从解码(decode)成Unicode字符串,反之将Unicode字符串编码(encode)成常规的字节字符串。换句话说:

在Python 2中,你需要将一个str进行解码(de-code),得到一个unicode字符串。

然后,你需要将一个unicode字符串进行编码(en-code),得到一个str(在Python 2中)。

因此:

unicode_char = u'\xb0'

encodedchar = unicode_char.encode('utf-8')

encodedchar将包含您的Unicode字符,以所选编码(在本例中为utf-8)显示。

Python 3也适用相同的原则。您需要对bytes对象进行解码以生成str对象。您需要对str对象进行编码以生成bytes对象。


2
Python 3 对编码的字节数组和抽象(Unicode)字符字符串有更清晰的概念。 - ulidtko
2
需要注意的是,这肯定是F.C.隐含问题的正确答案,但是那些因为遇到这种看似自相矛盾的行为而来到这里的人,在没有注意到他们尝试解码的字符串中有一小部分已经是Unicode字符串的情况下,他们可能会从其他答案中受益更多。 - Dawn Drescher
2
u'KEEP ME ㉃‰䥈啌ੁ剆䕅 KEEP ME ALSO'.encode('utf-8').decode('ascii','ignore') # worked for me - David Kierans
@DaveKierans 这将丢弃字符串中的所有非ASCII字符(例如那些中文字符)。确保这是你想要的! - Aphex

21

来自http://wiki.python.org/moin/UnicodeEncodeError

有时候出现 UnicodeEncodeError 错误,原因竟然是在解码时发生了错误。这似乎是由于特定编码的 decode() 函数通常期望 str 类型的参数。当它们遇到 unicode 参数时,它们会将其“降级”为 str,然后使用自己的编码方式对结果进行解码。此外,看起来这个“降级”操作是使用 ASCII 编码器执行的。因此,就在解码器内部产生编码失败的错误。


14
这似乎是纯粹的疯狂。如果你在一个 Unicode 对象上调用 decode(),我期望它只是返回原来的对象,因为很明显它已经是一个 Unicode 对象了... - rkrzr
在Python 3中,您无法在str / unicode对象上调用decode,只能在bytes对象上调用。 - Flimm

6

您正在尝试解码unicode。使解码工作的隐式编码是失败的。


2
所以我想知道为什么Unicode对象中有一个解码方法,它的作用是什么? - Facundo Casco
3
使用非文本编解码器(如unicode-escape)时很方便。但在解码之前,它仍会将其编码为 str - Ignacio Vazquez-Abrams
7
方便?“显性优于隐性”和“特殊情况并不足以打破规则”。 - KurzedMetal
在Python 3中,str/unicode对象中没有decode方法,只有bytes对象中才有。 - Flimm
有时候,如果你加上 encoding('utf-8', 'ignore')) ,它会起作用。 - Just Me

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接