исключения с функциями кодирования / декодирования Python Unicode (почему ошибки = игнорировать, фактически игнорировать их ??) - PullRequest
5 голосов
/ 21 апреля 2010

Кто-нибудь знает, почему функции преобразования строк генерируют исключения, когда пропускается error = "ignore"? Как я могу преобразовать обычные строковые объекты Python в юникод без ошибок? Большое спасибо!

python -c "import codecs; codecs.open('tmp', 'wb', encoding='utf8', errors='ignore').write('кошка')"

возвращает
Traceback (последний вызов был последним):
Файл "", строка 1, в
Файл "/usr/lib/python2.6/codecs.py", строка 686, в записи
вернуть self.writer.write (данные)
Файл "/usr/lib/python2.6/codecs.py", строка 351, в записи
данные, потребляются = self.encode (объект, self.errors)
UnicodeDecodeError: кодек «ascii» не может декодировать байт 0xd0 в позиции 0: порядковый номер не в диапазоне (128)

РЕДАКТИРОВАТЬ - спасибо за ответы, но кто-нибудь знает, как преобразовать приведенный выше литерал, не используя префикс "u"? Причина в том, что вы, конечно, можете иметь дело с чем-то, что не является константой:)

Ответы [ 4 ]

3 голосов
/ 21 апреля 2010

Метод write (в Python 2) принимает объект Unicode, и вы передаете ему str - поэтому вызов encode в codecs.py строке 351 сначала пытается создать объект Unicode кодек по умолчанию, 'ascii'). Исправить это просто: измените write вызов на

write(u'кошка')

Префикс u сообщает Python, что вы используете объект Unicode, и все должно быть в порядке.

2 голосов
/ 21 апреля 2010

В Python 2.x используйте write ('кошка'.decode (' utf-8 ') * вместо write (' кошка ') .

Вы также можете использовать другую кодировку вместо utf-8.

Надеюсь, он не выдаст ошибку ...

2 голосов
/ 21 апреля 2010

не решение (от автора вопроса) Я только что узнал: используйте python3

python3 -c "import codecs; codecs.open('tmp', 'wb', encoding='utf8', errors='ignore').write('кошка')"
1 голос
/ 21 апреля 2010

проблема здесь === >>>> напишите ('кошка')

Вы пишете объект str, получатель ожидает объект в кодировке Unicode, поэтому он пытается преобразовать его в кодировку Unicode, используя кодировку по умолчанию (ascii), которая, конечно, (?) Создает известный (?) UnicodeDecodeError: 'ascii' codec can't decode byte 0xXX in position 0: ordinal not in range(128)

Весь смысл использования такого модуля кодеков состоит в том, чтобы заставить его конвертировать ваши юникод объекты в utf8-кодированные на лету - так что кормите его юникод

Обновление Как преобразовать буквальное или нелитеральное:

unicode_object = literal_or_whwhat.decode ("UNKNOWN_ENCODING")

Вы знаете, как закодирован ваш литерал? Хотите рассказать нам, чего вы пытаетесь достичь? Один вкладыш с python -c не сильно поможет; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...