首页 > 解决方案 > 如何仅将特殊字符转换为 html 实体而不转义 <、>、" 和 '?

问题描述

我需要将邮件中的特殊字符转义为 html5 实体,因为即使邮件以 utf8 格式发送,某些客户端邮件也无法正确显示它们。我不想在邮件中直接使用实体,因为邮件是由测试人员制作的,我们不想强制测试人员学习所有 html5 实体。

我试着用

org.unbescape.html.HtmlEscape.escapeHtml​(
    string, 
    HtmlEscapeType.HTML5_NAMED_REFERENCES_DEFAULT_TO_DECIMAL,
    HtmlEscapeLevel.LEVEL_2_ALL_NON_ASCII_PLUS_MARKUP_SIGNIFICANT
)

关联

但他们也都逃脱了,<>字符。"'

现在我正在使用这种自制的方法:

public static final String encodeHTML(final String s) {
    String res = HtmlEscape.escapeHtml(
        s, 
        HtmlEscapeType.HTML5_NAMED_REFERENCES_DEFAULT_TO_DECIMAL,
        HtmlEscapeLevel.LEVEL_2_ALL_NON_ASCII_PLUS_MARKUP_SIGNIFICANT
    );

    res = res.replaceAll("&lt;", "<");
    res = res.replaceAll("&gt;", ">");
    res = res.replaceAll("&quot;", "\"");
    res = res.replaceAll("&apos;", "'");
    res = res.replaceAll("&amp;", "&");

    return res;
}

例子:

encodeHTML("<div id='a' class\"ciao\">&amp; ®</div>")

输出:

<div id='a' class"ciao">&amp; &reg;</div>

这就是我想要的,但没有更标准的东西吗?

标签: javahtmlencodingjava-8html-entities

解决方案


以下代码可帮助您仅转换特殊字符。

import org.apache.commons.text.StringEscapeUtils;
import org.apache.commons.text.translate.AggregateTranslator;
import org.apache.commons.text.translate.EntityArrays;
import org.apache.commons.text.translate.LookupTranslator;

public String encodeHTML(String s) {

    StringEscapeUtils.Builder buider =StringEscapeUtils
        .builder(new AggregateTranslator(new LookupTranslator(EntityArrays.ISO8859_1_ESCAPE),
            new LookupTranslator(EntityArrays.HTML40_EXTENDED_ESCAPE)));

    return buider.escape(s).toString();
  }

推荐阅读