【问题标题】:How can I convert unsafe characters to safe characters for XML in Java?如何在 Java 中将不安全字符转换为 XML 的安全字符?
【发布时间】:2010-02-08 09:18:25
【问题描述】:

我的文本中有芬兰语字符(例如 ä、ö 和 å)在 XML 中不安全,是否有任何库/框架可用于此目的?

【问题讨论】:

  • 我认为我不会真正称这些字符为“不安全”。字符编码必须正确并匹配 XML 声明,仅此而已。
  • 显然我的 servlet 响应没有 response.setCharacterEncoding("UTF-8");但是当我添加它时,一切正常......

标签: java xml escaping


【解决方案1】:

XML 支持 Unicode,因此您真正需要转义的只有五个基本 XML 实体(gt、lt、quot、amp、apos)。如果你使用 StringEscapeUtils.escapeXML,它会将你所有的 ä、ö 和 å 变成丑陋的 \uabcd 东西。

【讨论】:

  • 顺便说一下,有一些字符被 XML 规范视为非法字符,无论您如何尝试对其进行编码。例如 ASCII NUL 字符。
【解决方案2】:

因此,为 xml 转义字符串的最佳方法是 StringEscapeUtils.escapeXML 来自Commons Lang,但正如这里有人已经说过的那样,这还不够 例如。如果想要拥有有效的 xml,应该从字符串中删除一些不可打印的控制字符。 为此,我使用了这个 sn-p:

/**
 * Function to strip control characters from a string.
 * Any character below a space will be stripped from the string.
 * @param iString the input string to be stripped.
 * @return a string containing the characters from iString minus any control characters.
 */
public String stripControlChars(String iString) {
    StringBuffer result = new StringBuffer(iString);
    int idx = result.length();
    while (idx-- > 0) {
        if (result.charAt(idx) < 0x20 && result.charAt(idx) != 0x9 && 
                result.charAt(idx) != 0xA && result.charAt(idx) != 0xD) {
            if (log.isDebugEnabled()) {
                log.debug("deleted character at: "+idx);
            }
            result.deleteCharAt(idx);
        }
    }
    return result.toString();
}

// Then 
String s = org.apache.commons.lang3.StringEscapeUtils.escapeXml(stripControlChars(s));

此外,使用 StringEscapeUtils.escapeXML Commons Lang 版本 3 作为该方法的先前版本也很重要,在这种情况下,需要进行更多转义。

【讨论】:

    【解决方案3】:

    来自Commons LangStringEscapeUtils 具有满足您需求的escapeXML 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      • 1970-01-01
      相关资源
      最近更新 更多