本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>
提问:用纯Java来转义HTML符号,都有什么方法?
以纯Java代码输出HTML时,是否存在建议的转义<,>,“和&字符的方法?”(不是手动执行以下操作)。
String source = "The less than sign (<) and ampersand (&) must be escaped before using them in HTML";
String escaped = source.replace("<", "<").replace("&", "&"); // ...
回答1:
Apache Commons Lang 的StringEscapeUtils:
import static org.apache.commons.lang.StringEscapeUtils.escapeHtml;
// ...
String source = "The less than sign (<) and ampersand (&) must be escaped before using them in HTML";
String escaped = escapeHtml(source);
对于最近的版本
import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4;
// ...
String escaped = escapeHtml4(source);
关于StringEscapeUtils:
escapeHtml方法使用HTML实体转义为字符串中的字符。
举个栗子:
输入字符串:"bread" & "butter"
输出字符串:"bread" & "butter".
支持所有已知的HTML 4.0实体,包括时髦的重音符号。 注意,常用的撇号转义字符(')不是合法实体,因此不受支持)。
输入的参数为要转义的字符串,即HTML实体
输出的参数为经过转义的新字符串。
如果输入为空字符串,则返回null
回答2:
简练而不失优雅的实现:
public static String escapeHTML(String s) {
StringBuilder out = new StringBuilder(Math.max(16, s.length()));
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c > 127 || c == '"' || c == '\'' || c == '<' || c == '>' || c == '&') {
out.append("&#");
out.append((int) c);
out.append(';');
} else {
out.append(c);
}
}
return out.toString();
}
基于stackoverflow.com/a/8838023/1… (此处缺少放大器)。 根据www.w3.org/TR/html4/sg… ,在if子句中检查的四个字符是唯一在128以下的字符。