Java,JavaCC:如何解析BMP之外的字符?

时间:2010-05-20 10:12:32

标签: java unicode utf-16 javacc

我指的是 the XML 1.1 spec

查看NameStartChar

的定义

NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]

如果我正确解释了这一点,那么最后一个范围(#x10000-#xEFFFF)超出了Java的char类型的 UTF16范围。所以它一定是 UTF32 ,对吗?所以,我需要针对此范围检查char对,而不是单char个,对吗?

我的问题是:

  • 如何使用标准Java方法检查此类字符范围?
  • 如何在JavaCC中定义这样的范围?
    • JavaCC抱怨\u10000\uEFFFF

谢谢!

注意: 请不要担心,我尝试编写自己的XML解析器。
编辑: 我正在编写一个解析器,它会检查来自其他(非XML)文本格式的文本输入是否与有效的XML名称匹配。

2 个答案:

答案 0 :(得分:3)

查看Character.toCodePoint(char, char),它会将代理对转换为全范围代码点。 String.codePointAt也可能对您有用。

在Character和String中有很多其他代理支持。要知道完全要调用哪些方法,我们需要知道您的具体情况。

答案 1 :(得分:0)

我发现http://www.fileformat.info/info/unicode/char/10000/index.htm是了解Unicode字符的便利网站。

例如,u + 10000和u + 10FFFF

String first = "\uD800\uDC00"; // u10000
String last = "\uDBFF\uDFFF"; // u10FFFF