2013-06-20 2 views
2

Я получил эту строку 'Velcro Back Rest \xa36.99'. У него нет u спереди. Его просто равный ascii.UnicodeDecodeError: кодек ascii не может декодировать байт 0xa3

Как преобразовать его в Юникод?

Я попробовал это,

>>> 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 как ОП этого вопроса. В ответ на этот комментарий Winston says "You should not encoding a string object ..."

Но работающий каркас требует, чтобы он преобразовывался в строку unicode. Я использую scrapy, и у меня есть эта линия.

loader.add_value('name', product_name) 

Здесь product_name содержит эту проблемную строку и выбрасывает ошибку.

ответ

11

Вы должны указать кодировку для декодирования байтов в 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.

+0

Идеальный ответ. Жаль, что я не мог +2 вас. –

+0

Не волнуйся @GenghisKhan, я тебя достал – Hassan

Смежные вопросы