9.4 用纯Java来转义HTML符号,都有什么方法?| Java Debug 笔记

200 阅读1分钟

本文正在参加「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("<", "&lt;").replace("&", "&amp;"); // ...

回答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"

输出字符串:&quot;bread&quot; &amp; &quot;butter&quot;.

支持所有已知的HTML 4.0实体,包括时髦的重音符号。 注意,常用的撇号转义字符(&apos;)不是合法实体,因此不受支持)。

输入的参数为要转义的字符串,即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以下的字符。