繁体   English   中英

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

[英]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将默认为ascii b是以UTF-8编码的字节串。 格式字符串也被提升,但它恰好从ASCII解码。 最好在所有地方使用Unicode:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM