Kiedy na przetłumaczonej stronie pojawia się znak &, czy jest on dekodowany jeszcze raz?

Gdy na stronie wyświetli się ciąg znaków `&`, pierwszą reakcją jest często ponowne jego zdekodowanie. Ale problem może być również odwrotny: ten sam fragment treści został już usunięty i szablon ponownie go ominął. Najpierw sprawdź, czy otrzymujesz oryginalny kod HTML, tekst DOM, czy zwykły ciąg znaków do wstawienia na stronę, a następnie zdecyduj, czy chcesz go przekonwertować.

Programiści tłumaczący strony internetowe lub dokumenty często napotykają intuicyjny problem: na przetłumaczonej stronie pojawia się ciąg &, więc podświadomie myślą: „Czy to o jedno dekodowanie mniej?"Ale może być też odwrotnie: ten sam fragment treści, który już uciekł, jest ponownie uciekany przez szablon.

Ten artykuł pomoże Ci najpierw określić, co masz pod ręką: surowy kod HTML, tekst DOM lub zwykły ciąg znaków gotowy do wstawienia na stronę. Zrozum to przed podjęciem decyzji o zmianie i bądź w stanie zweryfikować cały łańcuch przetwarzania na małej próbce.

Jeśli na stronie pojawi się&, czy chcesz go ponownie odkodować? Wniosek w jednym zdaniu

Najpierw potwierdź, w jakim stanie znajdują się aktualne dane, a następnie zdecyduj, czy chcesz je przekonwertować; nie zgaduj, czy rozwiązać kolejną warstwę na podstawie wyglądu ciągu.

twoja sytuacjaZalecane praktykipowód
Otrzymujesz oryginalny kod HTML i musisz przetłumaczyć tekstUżyj parsera, aby zlokalizować węzły tekstowe, a następnie je przetworzyćBezpośrednie zastąpienie ciągów znaków w kodzie źródłowym może łatwo przez pomyłkę uszkodzić znaczniki i atrybuty.
Otrzymujesz tekst DOMZwykle nie dekoduj już bezwarunkowoTekst jest już treścią semantyczną i dalsze dekodowanie może wymagać jeszcze jednej warstwy zrozumienia.
Otrzymujesz zwykły tekst tłumaczenia, który należy wyświetlić na stronie.Pozostaw to szablonowi, aby uciec jako tekstNiech pozycja wyjściowa określi metodę serializacji
Na stronie wyświetlane są literały takie jak <div>Najpierw potwierdź protokół wejściowy, a następnie zdecyduj, czy rozwiązać warstwęTreścią taką mogą być celowo zastrzeżone literały
Należy zachować trochę tekstu sformatowanegoStosuj jasną strategię czyszczeniaDozwolone fragmenty podlegają kontrolowanym regułom

Ucieczka jest kwestią granic wyjściowych

html.escape konwertuje znaki mające znaczenie HTML w zwykłym tekście na encje, podczas gdy html.unescape analizuje encje. Nie są to „etapy czyszczenia", które można nazwać zamiennie. Tłumacz zwykle potrzebuje tekstu semantycznego, a szablon potrzebuje serializowanego wyniku, który jest zgodny z obowiązującymi zasadami stanowiska.

Na przykład nazwa produktuR&D nie stwarza problemu, gdy jest wyświetlana jako tekst, ale zwykle jest wyrażana jako R&D po zapisaniu w kodzie źródłowym HTML. Jeśli ponownie nastąpi zmiana znaczenia, zmieni się na R&D, a przeglądarka wyświetli literał jednostki w środku. I odwrotnie, jeśli niezaufana treść zostanie zdekodowana i wstawiona bezpośrednio w formacie HTML, zawarte w niej znaczniki mogą zostać ponownie aktywowane.

Wykonaj mały eksperyment z trzema stanami

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

To jest przykładowa transformacja syntetyczna ze standardowej biblioteki, która nie wykonuje kodu HTML ani skryptów. Ostatnie dwie linie pokazują przetwarzanie „wyjścia w postaci tekstu", które nie jest bezpiecznym rozwiązaniem do czyszczenia HTML, ani też nie oznacza, że bezpieczne jest umieszczanie dowolnych wyników w JavaScript, CSS lub adresach URL. Różne konteksty wymagają różnych zasad.

Najpierw nadaj nazwę stanowi danych

Do rozróżnienia poszczególnych etapów można używaćsource_html, plain_text, translated_text i rendered_html, aby uniknąć wywoływania kilku typów content. Jeśli projekt na to pozwala, możesz także owinąć go lekką klasą danych, aby było jasne, która funkcja akceptuje tylko zwykły tekst.

Nazewnictwo nie zastępuje testowania, ale może pomóc w wykryciu błędów w okablowaniu, takich jak „zwrócenie ostatecznego kodu HTML tłumaczowi"podczas sprawdzania.

Aktualne wejściena co liczyćNależy najpierw potwierdzić
Surowy HTMLPrzetłumaczalny tekstZlokalizuj węzły tekstowe za pomocą parsera
Tekst DOMtekst w języku docelowymZwykle nie dekoduj już bezwarunkowo
Tłumaczenie zwykłego tekstuWidoczny tekst na stronieNiech szablony będą wyświetlane tekstowo
Dozwolony tekst sformatowanyBezpieczny klips ekspozycyjnyStosuj jasną strategię czyszczenia

Nie wykonuj dekodowania w pętli, dopóki nie będzie „więcej zmian"

Ten sposób pisania wydaje się być w stanie obsłużyć jednostki wielowarstwowe, ale w rzeczywistości zniszczy kod, który użytkownik pierwotnie chciał wyświetlić.&lt;div&gt; w samouczku może być wartością dosłowną, która jest celowo zarezerwowana, a nie pominiętą etykietą.

O tym, czy należy zdekodować dodatkową warstwę, decyduje protokół wejściowy i nie można tego odgadnąć na podstawie wyglądu ciągu znaków. Linki, wartości atrybutów i bloki kodu w treści mogą również mieć różne strategie tłumaczenia. Przechowywanie zestawu próbek regresji zawierających nawiasy ostrokątne, cudzysłowy, znaki ampersand i literały encji oraz oddzielne sprawdzanie przeanalizowanego tekstu i końcowego ekranu przeglądarki jest bardziej przydatne niż samo porównywanie ciągów plików źródłowych.

Używaj małych próbek, aby strzec granic tłumaczenia

Oceniając portal do tłumaczenia dokumentów, taki jak OmniDoc (portal produktowy), możesz umieścić powyższy przykład w pliku testowym HTML i sprawdzić, czy przykłady znaczników i nazwy produktów w tłumaczeniu nadal wyglądają zgodnie z oczekiwaniami.

„Tłumaczenie na język angielski"nie powinno być jedynym kryterium ukończenia. Znaczenie treści, uciekanie warstw i ochrona kodu są częścią dostawy.

W tym artykule wykorzystano próbki syntetyczne w celu zademonstrowania metody przetwarzania. Kod został sprawdzony na przykładach w izolowanym środowisku; nie stanowi to gwarancji wszystkich rzeczywistych plików ani wydajności produktu. Przed przystąpieniem do przetwarzania ważnych dokumentów prosimy o zachowanie oryginałów i zapoznanie się z nimi zgodnie z granicami i pozycjami akceptacji w tekście.

Źródła: Moduł HTML Pythona.

📊 Porównanie rdzeni

praktykaObowiązujące scenariuszeGłówne zagrożenia
Dekoduj bezpośrednio w pętli, aż ciąg nie będzie już się zmieniałGdy protokół nie jest jawnie wprowadzonyZniszczy dosłowny kod, który powinien zostać wyświetlony
To, czy rozwiązać warstwę, zależy od protokołu wejściowegoPoznaj aktualny stan danychNajpierw musisz dowiedzieć się, na jakim etapie znajdują się dane
Po tłumaczeniu zwykły tekst jest przekazywany do szablonu w celu zmiany tekstu.Pokaż tylko normalny tekstJeśli tekst został zmieniony, zostanie on zmieniony dwukrotnie i pojawi się&amp;amp;.

🎯 Która metoda jest dla Ciebie odpowiednia?

Jeśli otrzymasz surowy kod HTML

Najpierw użyj parsera, aby zlokalizować węzeł tekstowy, przetłumacz jedynie treść tekstową i nie wykonuj zamiany ciągów w całym kodzie źródłowym.

Jeśli otrzymasz tekst DOM

Zwykle nie ma potrzeby jego dekodowania i można go przetworzyć bezpośrednio jako zwykły tekst.

Jeśli chcesz wstawić tłumaczenie na stronę

Pozostaw szablonowi ucieczkę jako tekst, nie dekoduj go najpierw, a następnie wstaw jako HTML.

Jeśli strona musi wyświetlać kody takie jak &lt;div&gt;

Najpierw potwierdź protokół wejściowy, może to być celowo zarezerwowany literał i nie należy go traktować jako nieprzetworzonego znacznika.

❓ Często zadawane pytania (FAQ)

1. Kiedy na stronie pojawia się &amp;, oznacza to, że musiał zostać zdekodowany jeszcze raz?

niepewny. Może się również zdarzyć, że ten sam akapit treści został zmieniony i ponownie zmieniony przez szablon, co oznacza, że R&D staje się R&amp;D, a następnie R&amp;amp;D.

2. Czy dekodowanie można powtarzać, aż ciąg znaków nie będzie już się zmieniał?

Niezalecane. Takie podejście złamie kod, który powinien być wyświetlany dosłownie, a o tym, czy rozwiązać warstwę, powinien decydować protokół wejściowy.

3. Czy przetłumaczony tekst można wstawić bezpośrednio w formacie HTML?

Nie można go wstawić bezpośrednio. Zdekodowana treść może ponownie aktywować zawarte w niej znaczniki, dlatego należy odróżnić zwykły tekst od dozwolonego tekstu sformatowanego.

4. Dlaczego nie możemy po prostu porównać ciągów znaków w plikach źródłowych?

Ciąg pliku źródłowego nie odzwierciedla przeanalizowanego tekstu i ostatecznego wyświetlenia przeglądarki. Obydwa należy sprawdzić osobno, aby sprawdzić, czy liczba warstw ucieczkowych jest prawidłowa.

📝 Podsumowanie

Kiedy natkniesz się na &amp;, najpierw sprawdź, czy oryginalny tekst HTML, DOM czy zwykły ciąg znaków, który otrzymujesz, jest oryginalnym tekstem HTML, DOM czy zwykłym ciągiem znaków, a następnie zdecyduj, czy go przekonwertować. Tylko przy użyciu zestawu próbek regresji w celu ochrony uciekających granic wyniki tłumaczenia mogą być naprawdę wiarygodne.

Wypróbuj teraz: prześlij dokument, aby rozpocząć tłumaczenie, zachowując oryginalny układ

Zaktualizowano 2026-11-13