Когда & появляется на переведенной веб-странице, декодируется ли она еще раз?

Когда на странице отображается строка `&`, первой реакцией часто является ее повторное декодирование. Но проблема может быть и обратной: один и тот же фрагмент контента уже был экранирован и экранируется шаблоном снова. Сначала выясните, что вы получаете: исходный HTML, текст DOM или обычную строку, которую нужно вставить на страницу, а затем решите, следует ли ее конвертировать.

— Декодирование не следует зацикливать до тех пор, пока строка не перестанет изменяться, это нарушает пример кода, который должен быть представлен как есть.

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

Разработчики, переводящие веб-страницы или документы, часто сталкиваются с интуитивной проблемой: на переведенной странице появляется строка &, поэтому они подсознательно думают: «А что, на одну декодировку меньше?» Но может быть верно и обратное: та же часть контента, которая уже была экранирована, снова экранируется шаблоном.

Эта статья поможет вам сначала определить, что у вас под рукой: необработанный HTML, текст DOM или обычная строка, готовая для вставки на страницу. Поймите это, прежде чем принимать решение о переходе, и будьте в состоянии проверить всю цепочку обработки на небольшой выборке.

На странице появится ## &. Хотите расшифровать его еще раз? Вывод в одно предложение

Сначала подтвердите, в каком состоянии находятся текущие данные, а затем решите, нужно ли их конвертировать; не думайте, стоит ли решать еще один слой, основываясь на внешнем виде струны.

твоя ситуацияРекомендуемые практикипричина
Вы получаете исходный HTML, и вам нужно перевести текст.Используйте синтаксический анализатор для поиска текстовых узлов и их последующей обработки.Непосредственная замена строк в исходном коде может легко повредить теги и атрибуты по ошибке.
Вы получаете текст DOMОбычно больше не декодируют безоговорочноТекст уже представляет собой смысловое содержание, и дальнейшая расшифровка может потребовать еще одного уровня понимания.
Вы получаете простой текст перевода, который необходимо отобразить на странице.Оставьте это в шаблоне, чтобы оно было экранировано как текст.Пусть позиция вывода определяет метод сериализации
На странице отображаются такие литералы, как <div>.Сначала подтвердите входной протокол, а затем решите, следует ли решать слой.Такое содержимое может быть намеренно зарезервированными литералами.
Необходимо сохранить некоторый форматированный текстИспользуйте четкую стратегию очисткиРазрешенные фрагменты подчиняются контролируемым правилам.

Выход — это вопрос границ вывода

html.escape преобразует символы со значением HTML в обычном тексте в объекты, а html.unescape анализирует объекты. Это не «этапы очистки», которые можно назвать взаимозаменяемыми. Переводчику обычно нужен смысловой текст, а шаблону — сериализованный результат, соответствующий текущим правилам позиции.

Например, название продукта R&D без проблем отображается в виде текста, но при записи в исходный код HTML обычно выражается как R&D. Если он снова экранирован, он станет R&D, и браузер отобразит литерал сущности посередине. И наоборот, если ненадежный контент декодируется и вставляется непосредственно в виде HTML, теги в нем могут быть повторно активированы.

Проведите небольшой эксперимент, используя три состояния

import html

plain = 'R&D <Guide> "2026"'
encoded = html.escape(plain, quote=True)
double_encoded = html.escape(encoded, quote=True)

assert encoded == 'R&amp;D &lt;Guide&gt; &quot;2026&quot;'
assert html.unescape(encoded) == plain
assert html.unescape(double_encoded) == encoded
assert html.unescape(double_encoded) != plain

untrusted = '&lt;img src=x onerror=alert(1)&gt;'
decoded = html.unescape(untrusted)
safe_as_text = html.escape(decoded, quote=True)
assert decoded.startswith('<img')
assert safe_as_text.startswith('&lt;img')

Это пример синтетического преобразования из стандартной библиотеки, который не выполняет HTML или сценарии. Последние две строки демонстрируют обработку «вывода в виде текста», которая не является безопасным решением для очистки HTML, а также не означает, что можно безопасно помещать произвольные результаты в JavaScript, CSS или URL-адреса. Разные контексты требуют разных правил.

Сначала дайте состоянию данных имя

Вы можете использовать source_html, plain_text, translated_text и rendered_html, чтобы различать каждый этап и избегать вызова нескольких типов content. Если проект позволяет, вы также можете обернуть его облегченным классом данных, чтобы было понятно, какая функция принимает только простой текст.

Именование не заменяет тестирование, но может помочь обнаружить ошибки подключения, такие как «возврат окончательного HTML-кода переводчику» во время проверки.

Текущий входна что надеятьсяСначала должно быть подтверждено
Необработанный HTMLПереводимый текстНайдите текстовые узлы с помощью парсера
DOM-тексттекст на целевом языкеОбычно больше не декодируют безоговорочно
Перевод обычного текстаВидимый текст на страницеВозможность экранирования шаблонов в текстовом виде
Разрешен форматированный текстБезопасный зажим для дисплеяИспользуйте четкую стратегию очистки

Не зацикливать декодирование до тех пор, пока «больше не будет изменений»

Кажется, что такой способ написания позволяет обрабатывать многоуровневые сущности, но на самом деле он уничтожает код, который изначально хотел отобразить пользователь. &lt;div&gt; в руководстве может быть буквальным значением, которое намеренно зарезервировано, а не пропущенной меткой.

Необходимость декодирования дополнительного уровня должно определяться протоколом ввода и не может быть угадано по внешнему виду строки. Ссылки, значения атрибутов и блоки кода в теле также могут иметь разные стратегии перевода. Хранение набора образцов регрессии, содержащих угловые скобки, кавычки, амперсанды и литералы сущностей, а также отдельное изучение проанализированного текста и окончательного отображения в браузере более полезно, чем просто сравнение строк исходного файла.

Используйте небольшие выборки для защиты границ перевода

При оценке портала перевода документов, такого как OmniDoc (портал продуктов), вы можете поместить приведенный выше образец в тестовый файл HTML и посмотреть, отображаются ли примеры тегов и названия продуктов в переводе так, как ожидалось.

«Английский перевод» не должен быть единственным критерием завершения. Значение контента, экранирование слоев и защита кода — все это части поставки.

В этой статье для демонстрации метода обработки используются синтетические образцы. Код проверен на примерах в изолированной среде; это не является гарантией всех реальных файлов или производительности продукта. Перед обработкой важных документов, пожалуйста, сохраните оригиналы и просмотрите их по границам и пунктам приема в тексте.

Источники: HTML-модуль Python.

📊 Сравнение ядра

упражнятьсяПрименимые сценарииОсновные риски
Непосредственное циклическое декодирование до тех пор, пока строка не перестанет меняться.Когда протокол не указан явноУничтожит буквальный код, который должен отображаться.
Решение о том, решать ли слой, определяется входным протоколом.Знать текущее состояние данныхВам нужно сначала выяснить, на каком этапе находятся данные.
После перевода простой текст передается шаблону для экранирования текста.Показывать только обычный текстЕсли текст был экранирован, он будет экранирован дважды и появится&amp;amp;.

🎯 Какой метод подходит вам?

Если вы получили необработанный HTML-код

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

Если вы получили текст DOM

Обычно нет необходимости его декодировать, и его можно обрабатывать непосредственно как обычный текст.

Если вы хотите вставить перевод на страницу

Оставьте его в шаблоне, чтобы он отображался как текст, не декодируйте его сначала, а затем вставляйте как HTML.

Если на странице необходимо отображать коды типа &lt;div&gt;

Сначала подтвердите входной протокол, это может быть намеренно зарезервированный литерал, и его не следует рассматривать как необработанный тег.

❓ Часто задаваемые вопросы (FAQ)

1. Когда на странице появляется &amp;, его, должно быть, еще раз декодировали?

неопределенный. Также может случиться так, что один и тот же абзац содержимого был экранирован шаблоном и снова экранирован, то есть R&D становится R&amp;D, а затем становится R&amp;amp;D.

2. Можно ли зациклить декодирование до тех пор, пока строка не перестанет меняться?

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

3. Можно ли вставить переведенный текст непосредственно в формате HTML?

Его нельзя вставить напрямую. Декодированный контент может повторно активировать теги внутри него, а простой текст следует отличать от разрешенного форматированного текста.

4. Почему нельзя просто сравнить строки исходных файлов?

Строка исходного файла не отражает проанализированный текст и окончательное отображение браузера. Оба должны быть проверены отдельно, чтобы убедиться в правильности количества эвакуационных слоев.

📝 Резюме

При обнаружении &amp; сначала выясните, является ли исходный HTML, текст DOM или обычная строка, которую вы сейчас получаете, а затем решите, следует ли его преобразовать. Только при использовании набора выборок регрессии для защиты ускользающих границ результаты перевода могут быть по-настоящему надежными.

Попробуйте сейчас: загрузите документ, чтобы начать перевод, сохранив исходный макет.

Обновлено 2026-11-13