2010-05-20 3 views
4

Я имею в виду the XML 1.1 spec.Java, JavaCC: как разбирать символы вне BMP?

Посмотрите на определение 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) выходит за пределы диапазона utf16 из char типа Java. Так должно быть UTF32, правильно? Итак, мне нужно проверить пары char против этого диапазона, вместо одного char s, правильно?

Мои вопросы:

  • Как проверить такой характер диапазонов, используя стандартные методы Java?
  • Как определить такие диапазоны в JavaCC?
    • JavaCC жалуется \u10000 и \uEFFFF

Спасибо!

ПРИМЕЧАНИЕ:Не волнуйтесь, я не пытаюсь написать собственный XML-анализатор.
EDIT:Я пишу синтаксический анализатор, который проверял бы, будет ли текст ввода из разных текстовых форматов (не XML) соответствовать действительным именам XML.

+1

Явы сокрушается * символ * был задуман (чтобы защитить Snafu Гослинг), когда Unicode еще не было на 3.1. Следовательно, 16-бит char SNAFU. Это стало беспорядочным, как только Unicode 3.1 вышел, потому что вся аббревиатура char [] «абстрагируется не намного больше. Как отметил Джон Скит, трюк заключается в работе с 32-битными кодовыми точками (Java * int * s) и вычислением отношения * char-to-codepoint * в классе String и других. Ситуация * не * хорошая. Это один из беспощадных аспектов Java (потому что он затрагивает сломанный примитивный тип, глубоко укоренившийся в языке). – SyntaxT3rr0r

+1

Этот вопрос не имеет ничего общего с UTF-32. Такие обозначения, как '# x10FFFF' и' \ u10FFFF', представляют символы в реферате; UTF-16 и UTF-32 являются кодировками, которые сообщают компьютеру, как хранить символы в памяти.Java всегда использует UTF-16, поэтому символы вне BMP хранятся с использованием двух значений 'char' или суррогатной пары. Джон уже указал, как с ними справиться. –

ответ

3

Посмотрите на Character.toCodePoint(char, char), который преобразует суррогатную пару в кодовую точку полного диапазона. String.codePointAt также может быть вам полезен.

В символах и строках есть много другой суррогатной поддержки. Знать точно какие методы вызова, нам нужно будет узнать точную информацию о вашей ситуации.

+0

Спасибо. Хорошо, я разъяснил свои намерения в нижней части моего вопроса (см. ** РЕДАКТИРОВАТЬ **). –

 Смежные вопросы

  • Нет связанных вопросов^_^