是否有 JDK 类来执行 HTML 编码(但不是 URL 编码)?

2022-09-01 09:23:10

我当然熟悉和类。但是,我只需要HTML样式的编码。(我不想用等替换)。我不知道任何JDK内置的类将只做HTML编码。有吗?我知道还有其他选择(例如,Jakarta Commons Lang 'StringEscapeUtils'),但我不想在我需要这个项目的项目中添加另一个外部依赖项。java.net.URLEncoderjava.net.URLDecoder' ''+'

我希望在最近的JDK(又名5或6)中添加了一些东西,这将完成我不知道的事情。否则,我必须自己掷骰子。


答案 1

没有内置的JDK来做到这一点,但它是Jakarta commons-lang库的一部分。

String escaped = StringEscapeUtils.escapeHtml3(stringToEscape);
String escaped = StringEscapeUtils.escapeHtml4(stringToEscape);

查看 JavaDoc

添加依赖关系通常就像将jar放在某个地方一样简单,并且commons-lang具有许多有用的实用程序,因此通常值得将其加入。


答案 2

一个简单的方法似乎是这个:

/**
 * HTML encode of UTF8 string i.e. symbols with code more than 127 aren't encoded
 * Use Apache Commons Text StringEscapeUtils if it is possible
 *
 * <pre>
 * escapeHtml("\tIt's timeto hack & fun\r<script>alert(\"PWNED\")</script>")
 *    .equals("&#9;It&#39;s time to hack &amp; fun&#13;&lt;script&gt;alert(&quot;PWNED&quot;)&lt;/script&gt;")
 * </pre>
 */
public static String escapeHtml(String rawHtml) {
    int rawHtmlLength = rawHtml.length();
    // add 30% for additional encodings
    int capacity = (int) (rawHtmlLength * 1.3);
    StringBuilder sb = new StringBuilder(capacity);
    for (int i = 0; i < rawHtmlLength; i++) {
        char ch = rawHtml.charAt(i);
        if (ch == '<') {
            sb.append("&lt;");
        } else if (ch == '>') {
            sb.append("&gt;");
        } else if (ch == '"') {
            sb.append("&quot;");
        } else if (ch == '&') {
            sb.append("&amp;");
        } else if (ch < ' ' || ch == '\'') {
            // non printable ascii symbols escaped as numeric entity
            // single quote ' in html doesn't have &apos; so show it as numeric entity &#39;
            sb.append("&#").append((int)ch).append(';');
        } else {
            // any non ASCII char i.e. upper than 127 is still UTF
            sb.append(ch);
        }
    }
    return sb.toString();
}

但是,如果您确实需要转义所有非ASCII符号,即您将以7位编码传输编码文本,则将最后一个替换为:

        } else {
            // encode non ASCII characters if needed
            int c = (ch & 0xFFFF);
            if (c > 127) {
                sb.append("&#").append(c).append(';');
            } else {
                sb.append(ch);
            }
        }