Как лучше получить кодовую точку символа?
Мне нужно сделать кое-что с кодовыми точками и новой строкой. У меня есть функция, которая принимает 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')