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

StackOverflow https://stackoverflow.com/questions/1933184

  •  20-09-2019
  •  | 
  •  

Вопрос

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

Например, если предположить, что кодировка по умолчанию — ascii, команда

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

даст

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

Другие советы

>>> 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, чтобы заменить его выбранной строкой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top