UnicodeDecodeError:“ascii”编解码器无法将“\xc3\xa8”与“\xe8”一起解码

2024-05-19 03:01:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个奇怪的问题:

>>> 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,但不能同时打印。在

怎么了?我怎样才能把它们都打印出来?在


Tags: inmoststdincallfilelastprinttraceback
3条回答

实际问题是

b = 'Pal-Andr\xc3\xa8'

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

^{pr2}$

注意开头的u丢失。你可以进一步确认

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

但是当您将它们一起打印时,string将变成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'

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

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

我不知道这里真正的问题是什么,但有一件事可以肯定的是a是unicode字符串,b是字符串。在

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

这里有一个例子。在

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

相关问题 更多 >

    热门问题