Python не в состоянии кодировать плохой Unicode в ASCII - PullRequest
6 голосов
/ 25 мая 2011

У меня есть некоторый код Python, который получает строку с неверным юникодом. Когда я пытаюсь игнорировать плохие символы, Python все еще задыхается (версия 2.6.1). Вот как это воспроизвести:

s = 'ad\xc2-ven\xc2-ture'
s.encode('utf8', 'ignore')

бросает

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 2: ordinal not in range(128)

Что я делаю не так?

Ответы [ 2 ]

10 голосов
/ 25 мая 2011

Преобразование строки в экземпляр Unicode - это str.decode() в Python 2.x:

 >>> s.decode("ascii", "ignore")
 u'ad-ven-ture'
8 голосов
/ 25 мая 2011

Вы путаете "Unicode" и "UTF-8".Ваша строка s не является Unicode;это строка байтов в определенной кодировке (но не в UTF-8, более вероятно iso-8859-1 или около того). Переход от строки байтов к unicode выполняется путем декодирования данных, а не кодирование .Переход от юникода к байтовой строке - это кодирование.Возможно, вы хотели сделать s строкой в ​​юникоде:

>>> s = u'ad\xc2-ven\xc2-ture'
>>> s.encode('utf8', 'ignore')
'ad\xc3\x82-ven\xc3\x82-ture'

Или, возможно, вы хотите обрабатывать строку байтов как UTF-8, но игнорировать недопустимые последовательности, в этом случае вы декодируете строка байтов с игнорированием в качестве обработчика ошибок:

>>> s = 'ad\xc2-ven\xc2-ture'
>>> u = s.decode('utf-8', 'ignore')
>>> u
u'adventure'
>>> u.encode('utf-8')
'adventure'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...