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 sytuacja | Zalecane praktyki | powód |
|---|---|---|
| Otrzymujesz oryginalny kod HTML i musisz przetłumaczyć tekst | Uż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 DOM | Zwykle nie dekoduj już bezwarunkowo | Tekst 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 tekst | Niech 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 sformatowanego | Stosuj jasną strategię czyszczenia | Dozwolone 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&amp;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&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')
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ście | na co liczyć | Należy najpierw potwierdzić |
|---|---|---|
| Surowy HTML | Przetłumaczalny tekst | Zlokalizuj węzły tekstowe za pomocą parsera |
| Tekst DOM | tekst w języku docelowym | Zwykle nie dekoduj już bezwarunkowo |
| Tłumaczenie zwykłego tekstu | Widoczny tekst na stronie | Niech szablony będą wyświetlane tekstowo |
| Dozwolony tekst sformatowany | Bezpieczny klips ekspozycyjny | Stosuj 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ć.<div> 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
| praktyka | Obowiązujące scenariusze | Główne zagrożenia |
|---|---|---|
| Dekoduj bezpośrednio w pętli, aż ciąg nie będzie już się zmieniał | Gdy protokół nie jest jawnie wprowadzony | Zniszczy dosłowny kod, który powinien zostać wyświetlony |
| To, czy rozwiązać warstwę, zależy od protokołu wejściowego | Poznaj aktualny stan danych | Najpierw 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 tekst | Jeśli tekst został zmieniony, zostanie on zmieniony dwukrotnie i pojawi się&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 <div>
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ę &, 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&D, a następnie R&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 &, 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


