UnicodeDecodeError: 'ascii' codec can't decode '\xc3\xa8' together with '\xe8'

UnicodeDecodeError: 'ascii' codec can't decode '\xc3\xa8' together with '\xe8'

我遇到了下面这个奇怪的问题:

>>> a=u'Pal-Andr\xe8'
>>> b='Pal-Andr\xc3\xa8'
>>> print "%s %s" % (a,b) # boom
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 8: ordinal not in range(128)
>>> print "%s" % a
Pal-Andrè
>>> print "%s" % b
Pal-Andrè

我可以在哪里打印 ab,但不能同时打印。

有什么问题吗?我怎样才能把它们都打印出来?

实际问题是

b = 'Pal-Andr\xc3\xa8'

现在,b 有一个字符串文字而不是 unicode 文字。因此,当您将它们分别打印为字符串时,a 被视为 Unicode 字符串,而 b 被视为普通字符串。

>>> "%s" % a
u'Pal-Andr\xe8'
>>> "%s" % b
'Pal-Andr\xc3\xa8'

注意开头的 u 不见了。您可以进一步确认

>>> type("%s" % b)
<type 'str'>
>>> type("%s" % a)
<type 'unicode'>

但是当您将它们一起打印时,字符串变成了 unicode 字符串并且 \xc3 不是有效的 ASCII 代码,这就是代码失败的原因。

要修复它,您只需将 b 也声明为 unicode 文字,就像这样

>>> a=u'Pal-Andr\xe8'
>>> b=u'Pal-Andr\xc3\xa8'
>>> "%s" % a
u'Pal-Andr\xe8'
>>> "%s" % b
u'Pal-Andr\xc3\xa8'
>>> "%s %s" % (a, b)
u'Pal-Andr\xe8 Pal-Andr\xc3\xa8'

我不确定这里真正的问题是什么,但可以肯定的是 a 是一个 unicode 字符串,b 是一个字符串.

在打印它们之前,您必须对其中之一进行编码或解码。

这是一个例子。

>>> b = b.decode('utf-8') 
>>> print u"%s %s" % (a,b)
Pal-Andrè Pal-Andrè

混合使用 Unicode 和字节字符串使得组合打印尝试将所有内容提升为 Unicode 字符串。您必须使用正确的编解码器解码字节字符串,否则 Python 2 将默认为 asciib 是以 UTF-8 编码的字节串。格式字符串也被提升,但它恰好可以从 ASCII 解码。最好在任何地方都使用 Unicode:

>>> print u'%s %s' % (a,b.decode('utf8'))
Pal-Andrè Pal-Andrè