【问题标题】:Detect non valid XML characters检测无效的 XML 字符
【发布时间】:2015-05-14 14:45:35
【问题描述】:

关于这个问题:removing invalid XML characters from a string in java,在@McDowell 的回复中,他/她说删除无效 XML 字符的方法是:

String xml10pattern = "[^"
                + "\u0009\r\n" // #x9 | #xA | #xD 
                + "\u0020-\uD7FF" // [#x20-#xD7FF]
                + "\uE000-\uFFFD" // [#xE000-#xFFFD] 
                + "\ud800\udc00-\udbff\udfff" // [#x10000-#x10FFFF]
                + "]";

然后:

replaceAll(xml10pattern, "");

好吧,我有两个问题:

  • 不应该转义所有的 unicode 字符吗?我的意思是\\u0009\\u000A\\u000D...,而不是\u0009\r\n,就像我在@ogrisel 的回复中看到的那样:Stripping Invalid XML characters in Java
  • 我不明白最后一个范围 (U+10000–U+10FFFF) 是如何转换为 "\ud800\udc00-\udbff\udfff" 的。不是"\u10000-\u10FFFF"吗?

我确实必须检测或过滤这种字符,我不完全确定该怎么做。

顺便说一句,这必须在 JDK 1.5 上工作(因此,不允许使用像 \x{h...h} 这样的表达式)

非常感谢。

======更新======

我想检测String str 是否包含此类无效字符的方法是:

if (!str.replaceAll(pattern, "").equals(str)) { 
    // Contains non XML valid characters. 
}

非常欢迎任何其他建议;)

【问题讨论】:

  • 关于你的第二个问题,答案是否定的; Java char 是 UTF-16 代码单元,因此您需要在此处匹配代理对。但是请注意,从 Java 1.7 开始,您也可以改写 \x10000-\x10FFFF
  • @fge,这是怎么做到的?我不明白U+10000 是如何转换成\ud800\udc00
  • 我可以在这里给你的最好的是a Wikipedia link :) 它解释了如何生成前导和尾随代理。
  • 不错!我一直在寻找,但我没有注意到UTF-16
  • 我在 JAVA 6 环境中 (IBM J9 VM (build 2.6, JRE 1.6.0 Linux x86-32) 并收到错误 Illegal character range near index 56 表达式:[^\u0009\r\n\u0020-\uD7FF\uE000-\uFFFD\ud800\udc00-\udbff\udfff]。 56 指向udfff 前面的反斜杠。

标签: java regex xml unicode


【解决方案1】:

1) 双向工作,\u0009 是 java 转义序列,\\u0009 是正则表达式转义序列

2) Java String 是 UTF-16 编码的,U+10000 是用 2 个 16 位字符编码的 \ud800\udc00,参见 Character API Unicode Character Representations

【讨论】:

  • 尊重 1),我将与 replaceAll 一起使用。两者都行吗?我想检测它的使用方式是:str.replaceAll(pattern, "").equals(str)
  • String str2 = str.replaceAll(pattern, ""); - 你会得到 str2 删除了非 xml 字符。将您问题中的模式复制粘贴到您的代码中。它可以工作,没有双反斜杠
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
相关资源
最近更新 更多