Když se na přeložené webové stránce objeví &, je dekódováno ještě jednou?

Když se na stránce zobrazí řetězec `&`, první reakcí je často jeho opětovné dekódování. Problém ale může být i opačný: stejný kus obsahu již unikal a šablona jej znovu uniká. Nejprve zjistěte, zda to, co získáváte, je původní HTML, DOM text nebo obyčejný řetězec, který se má vložit do stránky, a poté se rozhodněte, zda to převedete.

Vývojáři, kteří překládají webové stránky nebo dokumenty, se často setkávají s intuitivním problémem: na přeložené stránce se objeví řetězec &, takže si podvědomě myslí: "Je to o jedno dekódování méně?" Opak ale může být také pravdou: stejný kus obsahu, který již unikl, je šablonou znovu unikl.

Tento článek vám pomůže nejprve zjistit, co máte v ruce: nezpracovaný HTML, text DOM nebo obyčejný řetězec připravený k vložení na stránku. Uvědomte si to před rozhodnutím, zda přejít, a buďte schopni ověřit celý procesní řetězec pomocí malého vzorku.

Na stránce se objeví &. Chcete to znovu dekódovat? Závěr jednou větou

Nejprve potvrďte, v jakém stavu jsou aktuální data, a poté se rozhodněte, zda je chcete převést; nehádejte, zda řešit další vrstvu podle vzhledu provázku.

vaší situaciDoporučené postupydůvod
Získáte původní HTML a musíte přeložit textPomocí analyzátoru vyhledejte textové uzly a poté je zpracujtePřímé nahrazení řetězců ve zdrojovém kódu může snadno omylem poškodit tagy a atributy.
Získáte text DOMObvykle již bezpodmínečně nedekódujteText je již sémantickým obsahem a další dekódování může vyžadovat další vrstvu porozumění.
Získáte prostý text překladu, který je třeba zobrazit na stránce.Nechte to na šabloně, aby unikla jako textNechte výstupní pozici určit způsob serializace
Na stránce jsou zobrazeny literály jako <div>Nejprve potvrďte vstupní protokol a poté se rozhodněte, zda chcete vyřešit vrstvuTakový obsah může být záměrně vyhrazenými literály
Je třeba zachovat nějaký formátovaný textPoužijte jasnou strategii čištěníPovolené fragmenty podléhají kontrolovaným pravidlům

Útěk je otázkou hranic výstupu

html.escape převádí znaky s významem HTML v běžném textu na entity, zatímco html.unescape analyzuje entity. Tyto dva nejsou "čistící kroky", které lze nazvat zaměnitelně. Překladač obvykle potřebuje sémantický text a šablona potřebuje serializovaný výsledek, který odpovídá aktuálním pravidlům pozice.

Například název produktu R&D nemá problém, když je zobrazen jako text, ale je obvykle vyjádřen jako R&D, když je zapsán do zdrojového kódu HTML. Pokud je znovu escapován, stane se R&D a prohlížeč zobrazí uprostřed entitní literál. Naopak, pokud je nedůvěryhodný obsah dekódován a vložen přímo jako HTML, mohou být značky v něm znovu aktivovány.

Proveďte malý experiment se třemi stavy

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')

Toto je ukázková syntetická transformace ze standardní knihovny, která neprovádí HTML ani skripty. Poslední dva řádky demonstrují zpracování „výstupu jako text", což není bezpečné řešení pro čištění HTML, ani z toho nevyplývá, že je bezpečné vkládat libovolné výsledky do JavaScriptu, CSS nebo URL. Různé kontexty vyžadují různá pravidla.

Nejprve pojmenujte datový stav

K rozlišení jednotlivých fází můžete použítsource_html, plain_text, translated_text a rendered_html, abyste se vyhnuli volání několika typů content. Pokud to projekt umožňuje, můžete jej také obalit odlehčenou datovou třídou, aby bylo jasné, která funkce přijímá pouze prostý text.

Pojmenování nenahrazuje testování, ale může pomoci najít chyby v zapojení, jako je „vrácení konečného kódu HTML překladateli"během kontroly.

Aktuální vstupv co doufatNejprve byste si to měli ověřit
Raw HTMLUmí překládat textPoužijte parser k lokalizaci textových uzlů
Text DOMText v cílovém jazyceObvykle byste neměli dekódovat bezpodmínečně
Překlad je čistý textText je viditelný na stránceNechte šablony uniknout textovým definicím
Povolit bohatý textBezpečnostní záznamPoužívejte jasnou strategii čištění

Neopakuj dekódování, dokud "už žádné změny"

Tento přístup se zdá řešit vícevrstvé entity, ale ve skutečnosti narušuje kód, který uživatelé původně chtěli ukázat.&lt;div&gt; v tutoriálu může být záměrně vyhrazena pro doslovná čísla, ne za vynechávající tagy.

Zda dekódovat další vrstvu, by měl být určen vstupním protokolem a nelze to odhadnout podle vzhledu řetězce. Odkazy, hodnoty atributů a bloky kódu v těle mohou mít také různé strategie překladu. Vedení sady regresních vzorků obsahujících úhlové závorky, uvozovky, ands a literály entit pro kontrolu parsovaného textu a konečného zobrazení prohlížeče je užitečnější než porovnávat pouze řetězce zdrojového souboru.

Ochrana hranic překladu pomocí malých vzorků

Při hodnocení portálů pro překlad dokumentů jako OmniDoc (produktový záznam) můžete výše uvedený vzor vložit do HTML testovacího souboru, abyste zjistili, zda se příklady tagů a názvy produktů v překladu stále zobrazují podle očekávání.

"Přeloženo do angličtiny" by nemělo být jediným kritériem pro dokončení. Význam obsahu, únikové vrstvy a ochrana kódu jsou součástí doručení.

Tento článek demonstruje způsob zpracování pomocí syntetických vzorků. Kód prošel vzorkovými kontrolami v izolovaném prostředí; To však neznamená záruku všech autentických dokumentů nebo výkonu produktu. Před zacházením s důležitými dokumenty si prosím ponechte originály a zkontrolujte je podle hranic a položek přijetí v dokumentu.

Zdroje: html modul Python.

📊 Srovnání jádra

MetodaPoužitelné scénářeHlavní rizika
Dekódujte ho v smyčce, dokud se řetězec nezměníKdyž neexistuje explicitní shoda vstupůTo naruší doslovné kódy, které by měly být zobrazeny
Zda dekódovat vrstvu 1, závisí na vstupním protokoluAktuální stav dat je známNejprve je potřeba upřesnit, ve které fázi se data nacházejí
Po překladu je prostý text předán šabloně, která má být parafrázována podle textuZobrazuje se pouze prostý textPokud text již byl uniknut a zastaralý, bude znovu uniknut, což vede k&amp;amp;

🎯 Která metoda ti vyhovuje?

Pokud dostanete originální HTML

Nejprve použijte parser k nalezení textových uzlů, přičemž překládáte pouze textový obsah bez nahrazování řetězců pro celý zdrojový kód.

Když dostaneš DOM text,

Obvykle není potřeba další dekódování; můžete to jednoduše zpracovat jako prostý text.

Pokud chceš vložit překlad na stránku

Nechte to na šabloně, aby unikla textem; nejdřív ji nedekódujte a pak ji vkládejte jako HTML.

Pokud stránka potřebuje zobrazit kód jako &lt;div&gt;,

Nejprve ověřte vstupní protokol; může být záměrně vyhrazen jako literál a neměl by být považován za chybějící štítek.

❓ Často kladené otázky (FAQ)

1. Zobrazuje stránka &amp; – znamená to, že byl dekódován vícekrát?

Nemusí to tak být. Může se také stát, že stejný obsah už byl uniknut a pak znovu uniknut šablonou, tj. R&D se stane R&amp;D a poté R&amp;amp;D.

2. Lze to dekódovat ve smyčce, dokud se struna nepřestane měnit?

Nedoporučuji. Tento přístup narušuje kód, který by měl být zobrazen doslovně, a zda dekódovat vrstvu, by měl rozhodnout vstupní protokol.

3. Lze překlad textu přímo vložit jako HTML?

Nelze ji vložit přímo. Dekódovaný obsah může znovu aktivovat své značky, proto byste měli nejprve rozlišit mezi prostým textem a povoleným bohatým textem.

4. Proč prostě nemůžete porovnat řetězce ve zdrojovém souboru?

Řetězce zdrojového souboru nemohou odrážet parsovaný text a konečný displej prohlížeče. Oba by měly být zkontrolovány zvlášť, aby se potvrdilo, zda je počet únikových vrstev správný.

📝 Shrnutí

Když narazíte na &amp;, nejprve si ujasnite, zda dostáváte originální HTML, DOM text nebo běžný řetězec, a pak se rozhodněte, zda ho převedete. Pouze použitím sady regresních vzorků k ochraně únikové hranice mohou být výsledky překladu skutečně spolehlivé.

Zkušenost nyní: Nahrajte svůj dokument a začněte s překladem, přičemž zachováte původní formátování

Aktualizováno 2026-11-13