![](/img/trans.png)
[英]UnicodeDecodeError: 'ascii' codec can't decode byte 0xa3
[英]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è
我可以分别打印a , b但不能同时打印两者。
有什么问题? 我怎么打印它们?
实际问题是
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.