заставить python заменять не кодируемые символы строкой по умолчанию - PullRequest
7 голосов
/ 19 декабря 2009

Я хочу, чтобы python игнорировал символы, которые он не может кодировать, просто заменив их строкой "<could not encode>".

E.g, при условии, что кодировкой по умолчанию является ascii, команда

'%s is the word'%'ébác'

даст

'<could not encode>b<could not encode>c is the word'

Есть ли способ сделать это поведением по умолчанию для всего моего проекта?

Ответы [ 2 ]

11 голосов
/ 19 декабря 2009

Функция str.encode принимает необязательный аргумент, определяющий обработку ошибок:

str.encode([encoding[, errors]])

Из документов:

Возвращает закодированную версию строки. Кодировка по умолчанию - текущая кодировка строки по умолчанию. ошибки могут быть заданы для установки другой схемы обработки ошибок. По умолчанию для ошибок используется «строгий», что означает, что ошибки кодирования вызывают UnicodeError. Другими возможными значениями являются ignore, replace, xmlcharrefreplace, backslashreplace и любое другое имя, зарегистрированное с помощью codecs.register_error (), смотрите раздел Базовые классы кодеков. Список возможных кодировок см. В разделе «Стандартные кодировки».

В вашем случае может быть интересна функция codecs.register_error.

[Примечание о плохих символах ]

Кстати, обратите внимание, что при использовании register_error вы, скорее всего, замените не только отдельные плохие символы, но и группы последовательных плохих символов своей строкой, если не будете обращать на это внимание. Вы получаете один вызов обработчика ошибок за запуск плохих символов, а не за символ.

5 голосов
/ 19 декабря 2009
>>> help("".encode)
Help on built-in function encode:

encode(...)
S.encode([encoding[,errors]]) -> object

Encodes S using the codec registered for encoding. encoding defaults
to the default encoding. errors may be given to set a different error
handling scheme. Default is 'strict' meaning that encoding errors raise
a UnicodeEncodeError. **Other possible values are** 'ignore', **'replace'** and
'xmlcharrefreplace' as well as any other name registered with
codecs.register_error that is able to handle UnicodeEncodeErrors.

Так, например:

>>> x
'\xc3\xa9b\xc3\xa1c is the word'
>>> x.decode("ascii")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
>>> x.decode("ascii", "replace")
u'\ufffd\ufffdb\ufffd\ufffdc is the word'

Добавьте свой собственный обратный вызов в codecs.register_error, чтобы заменить его на строку по вашему выбору.

...