正如w3c所描述的那样,XML的有效字符是有限的。
我们可以通过遵循正则表达式来识别无效的字符:
/*
* From xml spec valid chars:
* #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF.
*/
Pattern pattern = Pattern.compile("[^\\x09\\x0A\\x0D\\x20-\\xD7EF\\xE000-\\xFFFD\\x10000-x10FFFF]");
但我不知道为什么表达不是:
Pattern pattern = Pattern.compile("[^\\x09\\x0A\\x0D\\x20-\\xD7EF\\xE000-\\xFFFD\\x10000-\\x10FFFF]");
错误消息是:
java.util.regex.PatternSyntaxException: Illegal character range near index 49
[^\x09\x0A\x0D\x20-\xD7EF\xE000-\xFFFD\x10000-\x10FFFF]
答案 0 :(得分:2)
简单回答:并非每个 Unicode代码点都可以在Java中表示为char
。这是因为代码点由21位数字标识,但char
仅为16位宽。因此,以U + 10000开头的代码点使用两个char
进行编码:a 高代理,然后是低代理。字符串和正则表达式适用于char
s,而不是代码点,因此您必须自己翻译它们。