заставьте Python заменить un-encodable символы строкой по умолчанию

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

Например, принятие кодировки по умолчанию является ASCII, командой

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

уступил бы

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

Там какой-либо путь состоит в том, чтобы сделать это поведением по умолчанию через весь мой проект?

7
задан olamundo 19 December 2009 в 15:28
поделиться

2 ответа

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

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

Из документации:

Возвращает закодированную версию строки. Кодировка по умолчанию - текущая кодировка строки по умолчанию. ошибки могут быть заданы для установки другой схемы обработки ошибок. По умолчанию для ошибок используется 'строгая' кодировка, что означает, что ошибки кодировки вызывают UnicodeError. Другими возможными значениями являются 'ignoredre', 'replace', 'xmlcharrefreplace', 'backslashreplace' и любое другое имя, зарегистрированное через codeecs.register_error(), смотрите раздел Codec Base Classes. Список возможных кодировок смотрите в разделе Стандартные кодировки.

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

.

[Обратите внимание на плохие символы ]

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

.
11
ответ дан 6 December 2019 в 12:51
поделиться
>>> 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'

Добавьте свой собственный обратный вызов в codeecs.register_error для замены на строку по вашему выбору.

.
5
ответ дан 6 December 2019 в 12:51
поделиться
Другие вопросы по тегам:

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