Методы encode()
и decode()
принимают параметр с именем errors
, который позволяет вам указать, как должны обрабатываться символы, которые не могут быть представлены в указанной кодировке. То, что вы ищете, - это замена ссылки на символы XML numeri c, которая, к счастью, является одним из стандартных обработчиков , предоставляемых в модуле codecs
.
Теперь это a little сложный, чтобы фактически выполнить замену так, как вы хотите, потому что операция замены символов, отличных от ASCII, соответствующими ссылками на символы XML numeri c происходит во время кодирования, а не декодирование. В конце концов, кодирование - это процесс, который принимает символы и испускает байты, поэтому только во время кодирования вы можете определить, есть ли у вас символ, не являющийся частью ASCII. Самый чистый способ, который я могу придумать на данный момент для получения желаемого преобразования, - это декодировать, перекодировать и повторно декодировать, применяя замену ссылки на сущность XML на этапе кодирования.
def decode_tostring(payload):
return payload.decode('latin-1').encode('ascii', errors='xmlcharrefreplace').decode('ascii')
Я не удивлюсь, если где-то есть метод, который заменит все символы, отличные от ASCII, в строке на их XML numeri c ссылки на символы и вернет вам строку, и если да, вы могли бы используйте его для замены кодировки и второго декодирования. Но я не знаю ни одного. Ближайшим, что я нашел на данный момент, был xml.sax.saxutils.escape()
, но он действует только на определенные c символы.
Это не имеет отношения к вашему основному вопросу, но я хотел прояснить одну вещь: объекты numeri c, такие как é
, являются особенностями SGML, HTML и XML, которые являются языками разметки - способом представления структурированных данные как текст. Они не имеют ничего общего с ASCII. Кодировка символов, такая как ASCII, представляет собой не что иное, как таблицу некоторых символов и некоторых последовательностей байтов, так что каждый символ в таблице отображается на одну последовательность байтов в таблице и наоборот, с некоторыми ограничениями, чтобы сделать сопоставление однозначным.
Если у вас есть строка с символами, которых нет в конкретной таблице кодировки, вы не можете закодировать строку, используя эту кодировку. Но вы можете преобразовать строку в новую строку, заменив символы, которых нет в таблице, последовательностями символов, которые равны в таблице, а затем закодировать новая строка. Есть много способов выполнить замену, например, XML numeri c ссылки на сущности. Некоторые из других обработчиков ошибок в модуле Python codecs
представляют другие подходы к этой замене.