исключения с Python unicode кодируют/декодируют функции (почему не делает errors=ignore, на самом деле игнорируют их??)

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

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" префикс? Так как причина, то, что Вы могли, конечно, иметь дело с чем-то, что не было константой :)

5
задан gatoatigrado 21 April 2010 в 02:49
поделиться

4 ответа

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

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

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

2
ответ дан 14 December 2019 в 04:33
поделиться

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

Вы пишете объект str, получатель ожидает объект unicode, поэтому он пытается преобразовать его в unicode, используя кодировку по умолчанию ( ascii), что, конечно, (?) вызывает хорошо известную (?) UnicodeDecodeError: кодек ascii не может декодировать байт 0xXX в позиции 0: порядковый номер не в диапазоне (128)

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

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

unicode_object = literal_or_whatever.decode ("UNKNOWN_ENCODING")

Вы знаете, как кодируется ваш литерал? Не хотели бы вы рассказать нам, чего вы пытаетесь достичь? Один лайнер с python -c не очень помогает; -)

1
ответ дан 14 December 2019 в 04:33
поделиться

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

write(u'кошка')

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

3
ответ дан 14 December 2019 в 04:33
поделиться

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

python3 -c "import codecs; codecs.open('tmp', 'wb', encoding='utf8', errors='ignore').write('кошка')"
2
ответ дан 14 December 2019 в 04:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: