【问题标题】:UnicodeDecodeError: 'ascii' codec can't decode byte 0xa3UnicodeDecodeError:“ascii”编解码器无法解码字节 0xa3
【发布时间】:2013-06-17 15:54:55
【问题描述】:

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

如何将其转换为 unicode?​​p>

我试过了,

>>> 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)

This answer 解释得很好。但我有 same question 作为那个问题的 OP。在对该评论的回答中,温斯顿says "You should not encoding a string object ..."

但是我正在工作的框架要求它应该被转换为 unicode 字符串。我用的是scrapy,我有这条线。

loader.add_value('name', product_name)

这里product_name 包含有问题的字符串,它会抛出错误。

【问题讨论】:

    标签: python unicode encoding utf-8 scrapy


    【解决方案1】:

    您需要指定一种编码来将字节解码为 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
    

    在这种情况下,我能够根据经验猜测编码,您需要为遇到的每种编码提供正确的编解码器。对于 web 数据,通常包含在 content-type 标头的 from 中:

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

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

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

    【讨论】:

    • 一个完美的答案。我希望我能为你 +2。
    • 别担心@GenghisKhan,我知道了
    猜你喜欢
    • 1970-01-01
    • 2013-08-20
    • 2014-04-09
    • 2018-08-02
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    相关资源
    最近更新 更多