【发布时间】: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前面的反斜杠。