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è
我可以在哪里打印 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è
我遇到了下面这个奇怪的问题:
>>> 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è