Как преобразовать только специальные символы в HTML-сущности без экранирования <,>, "и '? - PullRequest
0 голосов
/ 01 мая 2019

Мне нужно экранировать специальные символы в почте для объектов 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>")
* * Тысяча двадцать-одина выходы: * * 1 022
<div id='a' class"ciao">&amp; &reg;</div>

Это то, что я хочу, но нет ничего более стандартного?

1 Ответ

1 голос
/ 01 мая 2019

Следующий код поможет вам конвертировать только специальные символы.

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();
  }
...