Как лучше получить кодовую точку символа?

Мне нужно сделать кое-что с кодовыми точками и новой строкой. У меня есть функция, которая принимает char код, и если это \r это должно вести себя по-другому. Я получил это:

if (codePoint == Character.codePointAt(new char[] {'\r'}, 0)) {

но это очень уродливо и, конечно, не правильный способ сделать это. Какой правильный способ сделать это?

(Я знаю, что я мог бы жестко кодировать номер 13 (десятичный идентификатор для \r ) и использовать это, но делать это сделало бы неясным, что я делаю...)

3 ответа

Решение

Если вы знаете, что все ваши данные будут находиться в базовой многоязычной плоскости (от U+0000 до U+FFFF), тогда вы можете просто использовать:

char character = 'x';
int codePoint = character;

Это использует неявное преобразование из char в int, как указано в JLS 5.1.2:

19 конкретных преобразований примитивных типов называются расширяющимися примитивными преобразованиями:

  • ...
  • char в int, long, float, или же double

...

Расширяющееся преобразование char в целочисленный тип T ноль расширяет представление значения char для заполнения более широкого формата.

Тем не менее, char является только кодовой единицей UTF-16. Точка Character.codePointAt заключается в том, что он справляется с кодовыми точками вне BMP, которые состоят из суррогатной пары - двух кодовых блоков UTF-16, которые объединяются в единый символ.

Из JLS 3.1:

Стандарт Unicode изначально разрабатывался как 16-битная кодировка символов с фиксированной шириной. С тех пор он был изменен, чтобы учесть символы, для представления которых требуется более 16 бит. Диапазон кодовых точек теперь составляет от U+0000 до U+10FFFF с использованием шестнадцатеричной записи U+n. Символы, кодовые точки которых больше, чем U+FFFF, называются дополнительными символами. Для представления всего диапазона символов с использованием только 16-битных единиц стандарт Unicode определяет кодировку под названием UTF-16. В этом кодировании дополнительные символы представлены в виде пар 16-битных кодовых единиц, первая из диапазона с более высокими суррогатами (U+D800 до U+DBFF), вторая из диапазона с более низкими суррогатами (U+DC00 до U) +DFFF). Для символов в диапазоне от U+0000 до U+FFFF значения кодовых точек и кодовых единиц UTF-16 одинаковы.

Если вам нужно справиться с этой более сложной ситуацией, вам понадобится более сложный код.

Если я понимаю ваш вопрос, вы могли бы просто бросить char для int, что-то вроде этого

char ch = '\r';
int codePoint = (int) ch;
System.out.println(codePoint);

Выход

13

Я знаю, что этот вопрос старый, но ни один из существующих ответов на самом деле не отвечает на вопрос, включая принятый ответ.

Вы можете просто сравнить кодовую точку с символом напрямую.

      if (codePoint == '\r')
Другие вопросы по тегам