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

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

Розробники, які перекладають веб-сторінки чи документи, часто стикаються з інтуїтивно зрозумілою проблемою: на перекладеній сторінці з’являється рядок &, тому вони підсвідомо думають: «Чи на одне декодування менше?» Але може бути й протилежне: той самий фрагмент вмісту, який уже було екрановано, знову екранується шаблоном.

Ця стаття допоможе вам спочатку визначити, що у вас під рукою: необроблений HTML, текст DOM або звичайний рядок, готовий для вставлення на сторінку. Зрозумійте це, перш ніж вирішувати, чи переходити, і мати можливість перевірити весь ланцюжок обробки за допомогою невеликої вибірки.

Якщо & з'являється на сторінці, ви хочете декодувати його знову? Висновок одним реченням

Спочатку підтвердьте, у якому стані знаходяться поточні дані, а потім вирішіть, чи потрібно їх конвертувати; не вгадуйте, чи розв’язувати інший шар на основі зовнішнього вигляду рядка.

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

Втеча - це питання вихідних меж

html.escape перетворює символи зі значенням HTML у звичайному тексті на сутності, тоді як html.unescape аналізує сутності. Обидва вони не є "кроками очищення", які можна назвати взаємозамінними. Перекладачу зазвичай потрібен семантичний текст, а шаблону потрібен серіалізований результат, який відповідає поточним правилам позиції.

Наприклад, назва продукту R&D не викликає проблем, коли відображається як текст, але зазвичай виражається як R&D, коли записується у вихідний код HTML. Якщо його екранувати знову, він стане 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Текст цільової мовиЗазвичай не варто безумовно декодувати
Переклад — це чистий текстТекст видно на сторінціНехай шаблони уникають текстових визначень
Дозволити розширений текстКліп для дисплею безпекиВикористовуйте чітку стратегію очищення

Не повторюйте розшифровку до «No More Changes»

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

Декодування іншого шару має визначатися вхідним протоколом і не можна вгадувати за зовнішнім виглядом рядка. Посилання, значення атрибутів і кодові блоки в тілі також можуть мати різні стратегії трансляції. Збереження набору регресійних зразків із кутовими дужками, лапками, літералями та сутністю для перевірки проаналізованого тексту та фінального відображення браузера корисніше, ніж порівнювати лише рядки вихідного файлу.

Захист меж перекладу за допомогою невеликих зразків

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

«Перекладено англійською» не має бути єдиним критерієм завершення. Значення контенту, шари escape і захист коду — усе це частина процесу.

У цій статті демонструється метод обробки за допомогою синтетичних зразків. Код пройшов перевірку вибірки в ізольованому середовищі; Це не гарантує наявність усіх автентичних документів або продуктивності продукту. Перед тим, як братися за важливі документи, будь ласка, зберігайте оригінали та переглядайте їх відповідно до вимог і пунктів прийняття документа.

Джерела: Модуль html Python.

📊 Порівняння ядра

МетодЗастосовні сценаріїОсновні ризики
Декодуйте це в циклі, поки рядок не перестане змінюватисяКоли немає явної домовленості введенняВін зламає буквальні коди, які мають відображатися
Чи декодувати рівень 1, залежить від вхідного протоколуПоточний стан даних відомийСпочатку потрібно уточнити, на якому етапі знаходяться дані
Після перекладу простий текст передається шаблону для перефразування відповідно до текстуВідображається лише звичайний текстЯкщо текст уже був збережений і застарілий, він буде повторно скейпінг, що призведе до&amp;amp;

🎯 Який метод тобі підходить?

Якщо ви отримаєте оригінальний HTML

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

Якщо отримаєш повідомлення від DOM,

Зазвичай немає потреби в додатковому декодуванні; ви можете просто обробляти це як простий текст.

Якщо хочете вставити переклад на сторінку

Залиште шаблону, щоб втекти за текстом; не розшифровуйте спочатку і не вставляйте як HTML.

Якщо сторінка має відображати код на кшталт &lt;div&gt;,

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

❓ Поширені запитання (FAQ)

1. Чи показує сторінка &amp; — чи означає це, що її декодували кілька разів?

Не обов'язково. Також може бути так, що той самий контент вже був скинутий і знову скинутий шаблоном, тобто R&D стає R&amp;D, а потім R&amp;amp;D.

2. Чи можна декодувати це в циклі, поки рядок не перестане змінюватися?

Не рекомендую. Цей підхід порушує код, який має відображатися буквально, і питання декодування шару має вирішуватися вхідним протоколом.

3. Чи можна безпосередньо вставляти перекладений текст як HTML?

Не можна вставити напряму. Декодований контент може повторно активувати теги, тому спочатку слід розрізняти відкритий текст і дозволений формат у форматі rich тексту.

4. Чому ви не можете просто порівняти рядки у вихідному файлі?

Рядки вихідного файлу не можуть відображати розбитий текст і фінальний дисплей браузера. Обидва слід перевіряти окремо, щоб підтвердити, чи правильна кількість шарів escape.

📝 Резюме

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

Досвід зараз: завантажте документ, щоб почати переклад, зберігаючи оригінальне форматування

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