Czy istnieje sposób przekonwertowania ciągu znaków na ciąg znaków, który będzie poprawnie wyświetlany w dokumencie internetowym? Na przykład, zmieniając ciągJak uciec znaki specjalne HTML w Javie?
"<Hello>"
Aby
"<Hello>"
Czy istnieje sposób przekonwertowania ciągu znaków na ciąg znaków, który będzie poprawnie wyświetlany w dokumencie internetowym? Na przykład, zmieniając ciągJak uciec znaki specjalne HTML w Javie?
"<Hello>"
Aby
"<Hello>"
StringEscapeUtils
posiada funkcje zaprojektowane dokładnie do tego:
To jest zwykle nazywany "HTML ucieczki". Nie jestem świadomy czegokolwiek w standardowych bibliotekach, aby to zrobić (chociaż możesz to zobrazować za pomocą ucieczki XML). Istnieje jednak wiele niezależnych bibliotek, które mogą to zrobić. StringEscapeUtils z org.apache.commons.lang ma metodę escapeHtml
, która może to zrobić.
public static String stringToHTMLString(String string) {
StringBuffer sb = new StringBuffer(string.length());
// true if last char was blank
boolean lastWasBlankChar = false;
int len = string.length();
char c;
for (int i = 0; i < len; i++)
{
c = string.charAt(i);
if (c == ' ') {
// blank gets extra work,
// this solves the problem you get if you replace all
// blanks with , if you do that you loss
// word breaking
if (lastWasBlankChar) {
lastWasBlankChar = false;
sb.append(" ");
}
else {
lastWasBlankChar = true;
sb.append(' ');
}
}
else {
lastWasBlankChar = false;
//
// HTML Special Chars
if (c == '"')
sb.append(""");
else if (c == '&')
sb.append("&");
else if (c == '<')
sb.append("<");
else if (c == '>')
sb.append(">");
else if (c == '\n')
// Handle Newline
sb.append("<br/>");
else {
int ci = 0xffff & c;
if (ci < 160)
// nothing special only 7 Bit
sb.append(c);
else {
// Not 7 Bit use the unicode system
sb.append("&#");
sb.append(new Integer(ci).toString());
sb.append(';');
}
}
}
}
return sb.toString();
}
Dodatkowe znaki Unicode są zakodowane jako 2 znaki w łańcuchu, co nie spowoduje poprawnego renderowania. Aby wesprzeć Unicode, naprawdę musisz radzić sobie z punktami kodowymi, a nie z znakami. – Jakub
Hej Wiem, że to stary q, ale zastanawiałem się - dlaczego metoda String.replaceAll() nie działa zamiast przechodzić przez znaki jedna po drugiej? –
htmlentities jest klasa Open Source Java, który zawiera zbiór metod statycznych (htmlentities, unhtmlentities, ...) w celu przekształcenia specjalne i znaki rozszerzone w entitities HTML i vice versa.
http://www.tecnick.com/public/code/cp_dpage.php?aiocp_dp=htmlentities
Ten link już nie działa. Klasę można znaleźć tutaj: http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/StringEscapeUtils.html, a zawierający ją projekt znajduje się tutaj http: // commons.apache.org/proper/commons-lang/ – Jakub
@Jakub Dzięki. Zaktualizowano wpis nowszym adresem URL. – Amber