Текущая идиома для удаления символов 'surrogateescape' из декодированной строки - PullRequest
1 голос
/ 30 апреля 2019

Армин Ронахер, http://lucumr.pocoo.org/2013/7/2/the-updated-guide-to-unicode/

Если вы, например, передаете [результат os.fsdecode () или эквивалентного] в шаблонизатор, вы [иногда получаете UnicodeEncodeError] где-то в другом месте, и поскольку кодирование происходит на более поздней стадии, вы больше не знаете, почему Неверная строка Если вы обнаружите эту ошибку, когда она произойдет, проблема станет намного легче отладить

Армин предлагает функцию

def remove_surrogate_escaping(s, method='ignore'):
    assert method in ('ignore', 'replace'), 'invalid removal method'
    return s.encode('utf-8', method).decode('utf-8')

Ник Коглан, 2014, [Python-Dev] Очистка суррогатных экранированных строк

В настоящее время предложение по отслеживанию проблем заключается в том, чтобы ... воспользоваться существующие обработчики ошибок:

def convert_surrogateescape(data, errors='replace'):
    return data.encode('utf-8', 'surrogateescape').decode('utf-8', errors)

Этот код короткий, но семантически плотный - потребовалось несколько итераций, чтобы придумать эту версию. (Дополнительный бонус: как только вы будете предупреждены о возможно, написать свою собственную версию для существующего Python 3 тривиально версии. Стандартное имя облегчает поиск, когда вы приходите через него в куске кода, и предоставляет возможность его оптимизации позже, если это когда-нибудь будет стоить дополнительной работы)

Функции немного отличаются. Второй был написан со знанием первого.

Начиная с Python 3.5, обработчик ошибок backslashreplace теперь работает как с декодированием, так и с кодированием. Первый подход не предназначен для использования backslashreplace, например. ошибка декодирования байта 0xff будет напечатана как "\ udcff". Второй подход предназначен для решения этой проблемы; будет напечатано "\ xff".

Если вам не нужно backslashreplace, вы можете предпочесть первую версию, если вам не повезло поддерживать Python <3.5 (включая код polyglot 2/3, ой). </p>

Вопрос

Есть ли лучшая идиома для этой цели? Или мы все еще используем эту функцию?

1 Ответ

0 голосов
/ 30 апреля 2019

Ник ссылается на проблему для добавления такой функции в модуль codecs.По состоянию на 2019 г. функция не была добавлена, и билет остается открытым.


В последнем комментарии говорится

msg314682 Ник Коглан, 2018

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

Сюда входит одинокий суррогатный фиксатор: ftfy.fixes.fix_surrogates(text)

...

Я не нахожу функцию в ftfy привлекательным.В документации об этом не говорится, но, похоже, она предназначена для обработки surrogateescape и ... является частью обходного пути для CESU-8 или что-то в этом роде?

Заменить 16-битные суррогатные кодовые точки символами, которые они представляют (при правильном сопряжении) , или � в противном случае.

...