UnicodeDecodeError: 'ascii'编解码器无法解码字节0xa3

5

我得到了这个字符串'Velcro Back Rest \xa36.99'。请注意,它没有前面的u,只是普通的ASCII码。

我该如何将其转换为Unicode编码?

我尝试过这样做,

>>> unicode('Velcro Back Rest \xa36.99')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa3 in position 17: ordinal not in range(128)

这个答案解释得很好。但是我和那个问题的原始提问者有同样的问题。在对该评论的回答中,温斯顿说“你不应该对字符串对象进行编码…”

但是我正在使用的框架要求将其转换为Unicode字符串。我使用scrapy,有这一行代码。

loader.add_value('name', product_name)

在这里,product_name包含有问题的字符串并引发了错误。

1个回答

16

您需要指定一个编码方式,以便将字节解码为Unicode:

>>> 'Velcro Back Rest \xa36.99'.decode('latin1')
u'Velcro Back Rest \xa36.99'
>>> print 'Velcro Back Rest \xa36.99'.decode('latin1')
Velcro Back Rest £6.99

在这种情况下,我能够从经验中猜测编码方式,你需要为遇到的每种编码提供正确的编解码器。对于网络数据而言,这通常包含在内容类型头部中:

Content-Type: text/html; charset=iso-8859-1

iso-8859-1是Latin 1编码的官方标准名称。例如,Python将latin1识别为iso-8859-1的别名。

请注意,您的输入数据不是纯ASCII格式。如果是,它只会使用0到127范围内的字节;\xa3是163十进制,因此超出了ASCII范围。


一个完美的答案。我希望我能给你点赞 +2。 - Genghis Khan
不用担心,@GenghisKhan,我帮你搞定了。 - user377628

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接