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ší situaci | Doporučené postupy | důvod |
|---|---|---|
| Získáte původní HTML a musíte přeložit text | Pomocí analyzátoru vyhledejte textové uzly a poté je zpracujte | Přímé nahrazení řetězců ve zdrojovém kódu může snadno omylem poškodit tagy a atributy. |
| Získáte text DOM | Obvykle již bezpodmínečně nedekódujte | Text 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 text | Nechte 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 vrstvu | Takový obsah může být záměrně vyhrazenými literály |
| Je třeba zachovat nějaký formátovaný text | Použ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&amp;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&D <Guide> "2026"'
assert html.unescape(encoded) == plain
assert html.unescape(double_encoded) == encoded
assert html.unescape(double_encoded) != plain
untrusted = '<img src=x onerror=alert(1)>'
decoded = html.unescape(untrusted)
safe_as_text = html.escape(decoded, quote=True)
assert decoded.startswith('<img')
assert safe_as_text.startswith('<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í vstup | v co doufat | Nejprve byste si to měli ověřit |
|---|---|---|
| Raw HTML | Umí překládat text | Použijte parser k lokalizaci textových uzlů |
| Text DOM | Text v cílovém jazyce | Obvykle byste neměli dekódovat bezpodmínečně |
| Překlad je čistý text | Text je viditelný na stránce | Nechte šablony uniknout textovým definicím |
| Povolit bohatý text | Bezpečnostní záznam | Použí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.<div> 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
| Metoda | Použitelné scénáře | Hlavní 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 protokolu | Aktuální stav dat je znám | Nejprve 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 textu | Zobrazuje se pouze prostý text | Pokud text již byl uniknut a zastaralý, bude znovu uniknut, což vede k&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 <div>,
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 & – 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&D a poté R&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 &, 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í


