Entkoppelt eine Zeichenfolge, die Entity-Escapezeichen enthält, in eine Zeichenfolge, die die tatsächlichen Unicode-Zeichen enthält, die den Escapezeichen entsprechen. Unterstützt HTML 4.0-Entitäten.
Leider habe ich heute gerade festgestellt, dass es HTML-Sonderzeichen nicht sehr gut dekodiert :(
Sid
1
Ein schmutziger Trick besteht darin, den Wert zunächst in einem ausgeblendeten Feld zu speichern, um ihn zu umgehen. Dann sollte das Zielfeld den Wert aus dem ausgeblendeten Feld abrufen.
Ich mag die Zeichenfolge konvertieren , <p>üè</p>um <p>üé</p>mit StringEscapeUtils.unescapeHtml4()I erhalten <p>üè</p>. Gibt es eine Möglichkeit, vorhandene HTML-Tags intakt zu halten?
Nickkk
48
Die in anderen Antworten erwähnten Bibliotheken wären gute Lösungen, aber wenn Sie in Ihrem Projekt bereits in echtem HTML-Code stöbern, ist das Jsoup Code stöbern Projekt viel mehr zu bieten als nur die Verwaltung von "kaufmännischen und Pfund-FFFF-Semikolon" -Dingen.
// 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);
Außerdem erhalten Sie die praktische API zum Extrahieren und Bearbeiten von Daten mit den besten DOM-, CSS- und jquery-ähnlichen Methoden. Es ist Open Source und MIT-Lizenz.
upvote +, aber ich sollte darauf hinweisen, dass neuere Versionen von Jsoup .text()anstelle von.getText()
SourceVisor
4
Vielleicht ist direkter zu verwenden org.jsoup.parser.Parser.unescapeEntities(String string, boolean inAttribute). API-Dokumente: jsoup.org/apidocs/org/jsoup/parser/…
danneu
3
Das war perfekt, da ich Jsoup bereits in meinem Projekt verwende. Auch @danneu hatte Recht - Parser.unescapeEntities funktioniert genau wie angekündigt.
MandisaW
42
Ich habe in meinem Projekt Apache Commons StringEscapeUtils.unescapeHtml3 () ausprobiert, war aber mit der Leistung nicht zufrieden. Es stellt sich heraus, dass es viele unnötige Operationen ausführt. Zum einen wird jedem Aufruf ein StringWriter zugewiesen, auch wenn in der Zeichenfolge nichts zu entfernen ist. Ich habe diesen Code anders umgeschrieben, jetzt funktioniert er viel schneller. Wer dies in Google findet, kann es gerne nutzen.
Mit dem folgenden Code werden alle HTML 3-Symbole und numerischen Escapezeichen entfernt (entspricht Apache unescapeHtml3). Sie können der Karte einfach weitere Einträge hinzufügen, wenn Sie HTML 4 benötigen.
Vor kurzem musste ich ein langsames Struts-Projekt optimieren. Es stellte sich heraus, dass Struts unter dem Deckmantel Apache für HTML-Zeichenfolgen aufruft, die standardmäßig maskiert werden ( <s:property value="..."/>). Durch Deaktivieren von Escape ( <s:property value="..." escaping="false"/>) wurden einige Seiten 5% bis 20% schneller ausgeführt.
Stephan
Später fand ich heraus, dass dieser Code in eine Schleife eintreten kann, wenn eine leere Zeichenfolge als Argument angegeben wird. In der aktuellen Ausgabe wurde dieses Problem behoben.
Nick Frolov
Entkommt das oder nicht? &Ampere; wird nicht dekodiert. Nur & wird der Karte hinzugefügt, funktioniert es also nur in eine Richtung?
mmm
3
Ein StringWriter verwendet intern einen StringBuffer, der das Sperren verwendet. Die direkte Verwendung eines StringBuilder sollte schneller sein.
Axel Dörfler
4
@ NickFrolov, deine Kommentare scheinen ein bisschen durcheinander zu sein. aumlist zum Beispiel äund nicht д.
Aioobe
12
Die folgende Bibliothek kann auch für HTML- Escapezeichen in Java verwendet werden: unbescape .
Es hat nichts getan:%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
Bedrohung
40
@ThreaT Ihr Text ist nicht HTML-codiert, sondern URL-codiert.
Erwägen Sie die Verwendung der Java-Klasse HtmlManipulator . Möglicherweise müssen Sie einige Elemente hinzufügen (nicht alle Entitäten sind in der Liste enthalten).
Die von Kevin Hakanson vorgeschlagenen Apache Commons StringEscapeUtils funktionierten bei mir nicht zu 100%. Einige Entitäten wie & # 145 (linkes einfaches Anführungszeichen) wurden irgendwie in '222' übersetzt. Ich habe auch org.jsoup ausprobiert und hatte das gleiche Problem.
In meinem Fall verwende ich die Ersetzungsmethode, indem ich jede Entität in jeder Variablen teste. Mein Code sieht folgendermaßen aus:
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("ú","ú");
Dies ist nicht jede besondere Entität. Sogar die beiden in der Frage genannten fehlen.
Sandy Gifford
Dies wird nicht gut skalieren
Denov
-7
Wenn Sie nachahmen möchten, welche PHP-Funktion htmlspecialchars_decode die PHP-Funktion get_html_translation_table () verwendet, um die Tabelle zu sichern und dann den Java-Code wie folgt zu verwenden:
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;}
Wirf nicht so viel; Verwenden Sie Generika auf dieser HashMap! Verwenden Sie auch eine foreach, nicht eine Weile, um dies zu wiederholen, der Code wird viel lesbarer aussehen!
WhyNotHugo
3
@ Baladutt Wenn Sie Ihre Antwort verbessern, geben die Jungs Ihnen Punkte :)
Sparkyspider
3
Verbessere auch deine Funktions- und Variablennamen, @Bala.
Antworten:
Ich habe die Apache Commons StringEscapeUtils.unescapeHtml4 () dafür verwendet:
quelle
<p>üè</p>
um<p>üé</p>
mitStringEscapeUtils.unescapeHtml4()
I erhalten<p>üè</p>
. Gibt es eine Möglichkeit, vorhandene HTML-Tags intakt zu halten?Die in anderen Antworten erwähnten Bibliotheken wären gute Lösungen, aber wenn Sie in Ihrem Projekt bereits in echtem HTML-Code stöbern, ist das
Jsoup
Code stöbern Projekt viel mehr zu bieten als nur die Verwaltung von "kaufmännischen und Pfund-FFFF-Semikolon" -Dingen.Außerdem erhalten Sie die praktische API zum Extrahieren und Bearbeiten von Daten mit den besten DOM-, CSS- und jquery-ähnlichen Methoden. Es ist Open Source und MIT-Lizenz.
quelle
.text()
anstelle von.getText()
org.jsoup.parser.Parser.unescapeEntities(String string, boolean inAttribute)
. API-Dokumente: jsoup.org/apidocs/org/jsoup/parser/…Ich habe in meinem Projekt Apache Commons StringEscapeUtils.unescapeHtml3 () ausprobiert, war aber mit der Leistung nicht zufrieden. Es stellt sich heraus, dass es viele unnötige Operationen ausführt. Zum einen wird jedem Aufruf ein StringWriter zugewiesen, auch wenn in der Zeichenfolge nichts zu entfernen ist. Ich habe diesen Code anders umgeschrieben, jetzt funktioniert er viel schneller. Wer dies in Google findet, kann es gerne nutzen.
Mit dem folgenden Code werden alle HTML 3-Symbole und numerischen Escapezeichen entfernt (entspricht Apache unescapeHtml3). Sie können der Karte einfach weitere Einträge hinzufügen, wenn Sie HTML 4 benötigen.
quelle
<s:property value="..."/>
). Durch Deaktivieren von Escape (<s:property value="..." escaping="false"/>
) wurden einige Seiten 5% bis 20% schneller ausgeführt.auml
ist zum Beispielä
und nichtд
.Die folgende Bibliothek kann auch für HTML- Escapezeichen in Java verwendet werden: unbescape .
HTML kann folgendermaßen entkoppelt werden:
quelle
%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
Das hat den Job für mich gemacht,
oder
Ich denke, es ist immer besser, das
lang3
aus offensichtlichen Gründen zu verwenden. Hoffe das hilft :)quelle
Eine sehr einfache, aber ineffiziente Lösung ohne externe Bibliothek ist:
Dies sollte nur verwendet werden, wenn Sie nur eine geringe Anzahl von Zeichenfolgen zum Dekodieren haben.
quelle
Der zuverlässigste Weg ist mit
von
org.apache.commons.lang3.StringEscapeUtils
.Und um den weißen Räumen zu entkommen
Dadurch wird sichergestellt, dass Leerzeichen durch Kopieren und Einfügen in Webformulare nicht in der Datenbank beibehalten werden.
quelle
Spring Framework HtmlUtils
Wenn Sie Spring Framework bereits verwenden, verwenden Sie die folgende Methode:
quelle
Erwägen Sie die Verwendung der Java-Klasse HtmlManipulator . Möglicherweise müssen Sie einige Elemente hinzufügen (nicht alle Entitäten sind in der Liste enthalten).
Die von Kevin Hakanson vorgeschlagenen Apache Commons StringEscapeUtils funktionierten bei mir nicht zu 100%. Einige Entitäten wie & # 145 (linkes einfaches Anführungszeichen) wurden irgendwie in '222' übersetzt. Ich habe auch org.jsoup ausprobiert und hatte das gleiche Problem.
quelle
In meinem Fall verwende ich die Ersetzungsmethode, indem ich jede Entität in jeder Variablen teste. Mein Code sieht folgendermaßen aus:
In meinem Fall hat das sehr gut funktioniert.
quelle
Wenn Sie nachahmen möchten, welche PHP-Funktion htmlspecialchars_decode die PHP-Funktion get_html_translation_table () verwendet, um die Tabelle zu sichern und dann den Java-Code wie folgt zu verwenden:
quelle