StringEscapeUtils.escapeXml преобразует символы utf8, которые не должны - PullRequest
6 голосов
/ 24 января 2012

Функция escapeXml преобразует ѭ Ѯ в ѭ Ѯ, что, по-моему, не должно.Я прочитал, что он поддерживает только пять основных XML-сущностей (gt, lt, quot, amp, apos).

Существует ли функция, которая преобразует только эти пять основных XML-сущностей.

Ответы [ 4 ]

11 голосов
/ 24 января 2012
public String escapeXml(String s) {
    return s.replaceAll("&", "&amp;").replaceAll(">", "&gt;").replaceAll("<", "&lt;").replaceAll("\"", "&quot;").replaceAll("'", "&apos;");
}
6 голосов
/ 24 января 2012

Javadoc для версии 3.1 библиотеки говорит:

Обратите внимание, что символы Unicode больше 0x7f по состоянию на 3.0 больше не экранированы.Если вы все еще хотите эту функцию, вы можете достичь ее с помощью следующего: StringEscapeUtils.ESCAPE_XML.with (NumericEntityEscaper.between (0x7f, Integer.MAX_VALUE));

Так что вы, вероятно, используете более старую версиюбиблиотека.Обновите свои зависимости (или переопределите побег самостоятельно: это не ракетостроение)

2 голосов
/ 11 сентября 2017

Javadoc StringEscapeUtils.escapeXml говорит о том, что мы должны использовать

StringEscapeUtils.ESCAPE_XML.with( new UnicodeEscaper(Range.between(0x7f, Integer.MAX_VALUE)) );

Но вместо UnicodeEscaper следует использовать NumericEntityEscaper.UnicodeEscaper изменит все на \u1234 символов, но NumericEntityEscaper сбрасывается как &amp;#123;, что и ожидалось.

package mypackage;

import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.text.translate.CharSequenceTranslator;
import org.apache.commons.lang3.text.translate.NumericEntityEscaper;

public class XmlEscaper {
    public static void main(final String[] args) {
        final String xmlToEscape = "<hello>Hi</hello>" + "_ _" + "__ __"  + "___ ___" + "after &nbsp;"; // the line cont

        // no Unicode escape
        final String escapedXml = StringEscapeUtils.escapeXml(xmlToEscape);

        // escape Unicode as numeric codes. For instance, escape non-breaking space as &#160;
        final CharSequenceTranslator translator = StringEscapeUtils.ESCAPE_XML.with( NumericEntityEscaper.between(0x7f, Integer.MAX_VALUE) );
        final String escapedXmlWithUnicode = translator.translate(xmlToEscape);

        System.out.println("xmlToEscape: " + xmlToEscape);
        System.out.println("escapedXml: " + escapedXml); // does not escape Unicode characters like non-breaking space
        System.out.println("escapedXml with unicode: " + escapedXmlWithUnicode); // escapes Unicode characters
    }
}
0 голосов
/ 06 марта 2015

Во времена XML-документов в UTF-8, имеющих удобочитаемые символы, иногда предпочтительнее.Это должно сработать, и перекомпоновка String происходит только один раз.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

private static final Pattern ESCAPE_XML_CHARS = Pattern.compile("[\"&'<>]");

public static String escapeXml(String s) {
    Matcher m = ESCAPE_XML_CHARS.matcher(s);
    StringBuffer buf = new StringBuffer();
    while (m.find()) {
        switch (m.group().codePointAt(0)) {
            case '"':
                m.appendReplacement(buf, "&quot;");
            break;
            case '&':
                m.appendReplacement(buf, "&amp;");
            break;
            case '\'':
                m.appendReplacement(buf, "&apos;");
            break;
            case '<':
                m.appendReplacement(buf, "&lt;");
            break;
            case '>':
                m.appendReplacement(buf, "&gt;");
            break;
        }
    }
    m.appendTail(buf);
    return buf.toString();
}
...