Niestety, właśnie dzisiaj zdałem sobie sprawę, że nie dekoduje znaków specjalnych HTML zbyt dobrze :(
Sid,
1
brudną sztuczką jest przechowywanie wartości początkowo w ukrytym polu, aby przed nią uciec, a następnie pole docelowe powinno pobrać wartość z ukrytego pola.
setzamora
2
Klasa StringEscapeUtils jest przestarzała i przeniesiona do Apache commons-text
Pauli
2
Chcę przekonwertować ciąg <p>üè</p>na <p>üé</p>, StringEscapeUtils.unescapeHtml4()otrzymam <p>üè</p>. Czy istnieje sposób na utrzymanie istniejących tagów HTML w stanie nienaruszonym?
Nickkk
48
Biblioteki wymienione w innych odpowiedziach byłyby dobrym rozwiązaniem, ale jeśli zdarzyło Ci się już przekopywać w swoim projekcie rzeczywisty kod HTML, Jsoup projekt ma znacznie więcej do zaoferowania niż tylko zarządzanie „ampersand pound FFFF średnik” .
// textValue: <p>This is a sample. \"Granny\" Smith –.<\/p>\r\n// becomes this: This is a sample. "Granny" Smith –.// with one line of code:// Jsoup.parse(textValue).getText(); // for older versions of JsoupJsoup.parse(textValue).text();// Another possibility may be the static unescapeEntities method:boolean strictMode =true;String unescapedString = org.jsoup.parser.Parser.unescapeEntities(textValue, strictMode);
Otrzymujesz także wygodny interfejs API do wyodrębniania i manipulowania danymi przy użyciu najlepszych metod DOM, CSS i jquery. Jest to open source i licencja MIT.
upvote +, ale powinienem zaznaczyć, że nowsze wersje Jsoup używają .text()zamiast.getText()
SourceVisor
4
Być może bardziej bezpośrednie jest użycie org.jsoup.parser.Parser.unescapeEntities(String string, boolean inAttribute). Dokumentacja
danneu
3
To było idealne, ponieważ już używam Jsoup w moim projekcie. Również @danneu miał rację - Parser.unescapeEntities działa dokładnie tak, jak w reklamie.
MandisaW,
42
Wypróbowałem Apache Commons StringEscapeUtils.unescapeHtml3 () w moim projekcie, ale nie byłem zadowolony z jego wydajności. Okazuje się, że wykonuje wiele niepotrzebnych operacji. Po pierwsze, przydziela StringWriter dla każdego wywołania, nawet jeśli w ciągu nie ma nic do cofnięcia. Przepisałem ten kod inaczej, teraz działa znacznie szybciej. Każdy, kto znajdzie to w Google, może z niego skorzystać.
Poniższy kod powoduje usunięcie wszystkich symboli HTML 3 i liczbowych znaków ucieczki (odpowiednik Apache unescapeHtml3). Możesz po prostu dodać więcej wpisów do mapy, jeśli potrzebujesz HTML 4.
Ostatnio musiałem zoptymalizować powolny projekt Struts. Okazało się, że pod osłoną Struts wywołuje Apache domyślnie dla znaków html ze znakami ucieczki ( <s:property value="..."/>). Wyłączenie ucieczki ( <s:property value="..." escaping="false"/>) spowodowało, że niektóre strony działały o 5% do 20% szybciej.
Stephan,
Później dowiedziałem się, że ten kod może wejść w pętlę, gdy podany zostanie pusty łańcuch jako argument. Bieżąca edycja rozwiązała ten problem.
Nick Frolov
Czy to ucieka, czy przestaje? & amp; nie jest dekodowany. Tylko & jest dodawane do mapy, więc działa tylko w jedną stronę?
mmm
3
StringWriter używa wewnętrznie StringBuffer, który używa blokowania. Bezpośrednie użycie StringBuilder powinno być szybsze.
Axel Dörfler
4
@NickFrolov, twoje komentarze wydają się trochę pomieszane. aumljest na przykład, äa nie д.
aioobe
12
Następująca biblioteka może być również używana do ucieczki HTML w Javie: unbescape .
To nic nie dało:%3Chtml%3E%0D%0A%3Chead%3E%0D%0A%3Ctitle%3Etest%3C%2Ftitle%3E%0D%0A%3C%2Fhead%3E%0D%0A%3Cbody%3E%0D%0Atest%0D%0A%3C%2Fbody%3E%0D%0A%3C%2Fhtml%3E
Groźba
40
@ThreaT Twój tekst nie jest zakodowany w formacie HTML, jest zakodowany w postaci adresu URL.
Rozważ użycie klasy Java HtmlManipulator . Może być konieczne dodanie niektórych elementów (nie wszystkie elementy znajdują się na liście).
Apache Commons StringEscapeUtils, jak zasugerował Kevin Hakanson, nie działało dla mnie w 100%; kilka jednostek, takich jak & # 145 (pojedynczy cudzysłów po lewej), zostało w jakiś sposób przetłumaczonych na '222'. Próbowałem też org.jsoup i miałem ten sam problem.
W moim przypadku używam metody replace, testując każdą jednostkę w każdej zmiennej, mój kod wygląda następująco:
text = text.replace("Ç","Ç");
text = text.replace("ç","ç");
text = text.replace("Á","Á");
text = text.replace("Â","Â");
text = text.replace("Ã","Ã");
text = text.replace("É","É");
text = text.replace("Ê","Ê");
text = text.replace("Í","Í");
text = text.replace("Ô","Ô");
text = text.replace("Õ","Õ");
text = text.replace("Ó","Ó");
text = text.replace("Ú","Ú");
text = text.replace("á","á");
text = text.replace("â","â");
text = text.replace("ã","ã");
text = text.replace("é","é");
text = text.replace("ê","ê");
text = text.replace("í","í");
text = text.replace("ô","ô");
text = text.replace("õ","õ");
text = text.replace("ó","ó");
text = text.replace("ú","ú");
To nie jest każda szczególna jednostka. Brakuje nawet dwóch wymienionych w pytaniu.
Sandy Gifford
to nie będzie dobrze skalowane
denov
-7
Przypuśćmy, że chcesz naśladować funkcję php, która htmlspecialchars_decode używa funkcji php get_html_translation_table (), aby zrzucić tabelę, a następnie użyć kodu java, takiego jak:
staticMap<String,String> html_specialchars_table =newHashtable<String,String>();static{
html_specialchars_table.put("<","<");
html_specialchars_table.put(">",">");
html_specialchars_table.put("&","&");}staticString htmlspecialchars_decode_ENT_NOQUOTES(String s){Enumeration en = html_specialchars_table.keys();while(en.hasMoreElements()){String key = en.nextElement();String val = html_specialchars_table.get(key);
s = s.replaceAll(key, val);}return s;}
Nie rzucaj tak dużo; użyj typów generycznych na tej HashMap! Ponadto, użyj foreach, nie czekaj długo, aby to sprawdzić, kod będzie wyglądał o wiele bardziej czytelnie!
WhyNotHugo
3
@BalaDutt jeśli poprawisz swoją odpowiedź, chłopaki dadzą Ci punkty :)
Odpowiedzi:
W tym celu użyłem Apache Commons StringEscapeUtils.unescapeHtml4 () :
źródło
<p>üè</p>
na<p>üé</p>
,StringEscapeUtils.unescapeHtml4()
otrzymam<p>üè</p>
. Czy istnieje sposób na utrzymanie istniejących tagów HTML w stanie nienaruszonym?Biblioteki wymienione w innych odpowiedziach byłyby dobrym rozwiązaniem, ale jeśli zdarzyło Ci się już przekopywać w swoim projekcie rzeczywisty kod HTML,
Jsoup
projekt ma znacznie więcej do zaoferowania niż tylko zarządzanie „ampersand pound FFFF średnik” .Otrzymujesz także wygodny interfejs API do wyodrębniania i manipulowania danymi przy użyciu najlepszych metod DOM, CSS i jquery. Jest to open source i licencja MIT.
źródło
.text()
zamiast.getText()
org.jsoup.parser.Parser.unescapeEntities(String string, boolean inAttribute)
. DokumentacjaWypróbowałem Apache Commons StringEscapeUtils.unescapeHtml3 () w moim projekcie, ale nie byłem zadowolony z jego wydajności. Okazuje się, że wykonuje wiele niepotrzebnych operacji. Po pierwsze, przydziela StringWriter dla każdego wywołania, nawet jeśli w ciągu nie ma nic do cofnięcia. Przepisałem ten kod inaczej, teraz działa znacznie szybciej. Każdy, kto znajdzie to w Google, może z niego skorzystać.
Poniższy kod powoduje usunięcie wszystkich symboli HTML 3 i liczbowych znaków ucieczki (odpowiednik Apache unescapeHtml3). Możesz po prostu dodać więcej wpisów do mapy, jeśli potrzebujesz HTML 4.
źródło
<s:property value="..."/>
). Wyłączenie ucieczki (<s:property value="..." escaping="false"/>
) spowodowało, że niektóre strony działały o 5% do 20% szybciej.auml
jest na przykład,ä
a nieд
.Następująca biblioteka może być również używana do ucieczki HTML w Javie: unbescape .
Kod HTML można usunąć w ten sposób:
źródło
%3Chtml%3E%0D%0A%3Chead%3E%0D%0A%3Ctitle%3Etest%3C%2Ftitle%3E%0D%0A%3C%2Fhead%3E%0D%0A%3Cbody%3E%0D%0Atest%0D%0A%3C%2Fbody%3E%0D%0A%3C%2Fhtml%3E
To wykonało pracę za mnie,
lub
Myślę, że zawsze lepiej jest korzystać z
lang3
oczywistych powodów. Mam nadzieję że to pomoże :)źródło
Bardzo prostym, ale nieefektywnym rozwiązaniem bez żadnej zewnętrznej biblioteki jest:
Powinno to być używane tylko wtedy, gdy masz tylko małą liczbę ciągów do zdekodowania.
źródło
Najbardziej niezawodny sposób to
od
org.apache.commons.lang3.StringEscapeUtils
.I uciec od białych znaków
Zapewni to, że spacje spowodowane kopiowaniem i wklejaniem w formularzach internetowych nie zostaną utrwalone w bazie danych.
źródło
Spring Framework HtmlUtils
Jeśli korzystasz już ze środowiska Spring, użyj następującej metody:
źródło
Rozważ użycie klasy Java HtmlManipulator . Może być konieczne dodanie niektórych elementów (nie wszystkie elementy znajdują się na liście).
Apache Commons StringEscapeUtils, jak zasugerował Kevin Hakanson, nie działało dla mnie w 100%; kilka jednostek, takich jak & # 145 (pojedynczy cudzysłów po lewej), zostało w jakiś sposób przetłumaczonych na '222'. Próbowałem też org.jsoup i miałem ten sam problem.
źródło
W moim przypadku używam metody replace, testując każdą jednostkę w każdej zmiennej, mój kod wygląda następująco:
W moim przypadku to zadziałało bardzo dobrze.
źródło
Przypuśćmy, że chcesz naśladować funkcję php, która htmlspecialchars_decode używa funkcji php get_html_translation_table (), aby zrzucić tabelę, a następnie użyć kodu java, takiego jak:
źródło