Армин Ронахер, 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>
Вопрос
Есть ли лучшая идиома для этой цели? Или мы все еще используем эту функцию?