Char для юникода более U + FFFF в java?

Как я могу показать символ Unicode выше U + FFFF с помощью char в Java?

Мне нужно что-то вроде этого (если оно действительно):

char u = '\u+10FFFF';

Ответ 1

Вы не можете сделать это с помощью одного char (который содержит модуль кода UTF-16), но вы можете использовать String:

// This represents U+10FFFF
String x = "\udbff\udfff";

В качестве альтернативы:

String y = new StringBuilder().appendCodePoint(0x10ffff).toString();

Это суррогатная пара (два кодовых блока UTF-16, которые объединяются, чтобы сформировать единую кодовую точку Unicode за пределами базовой многоязычной плоскости). Конечно, вам нужно, что бы вы отображали ваши данные, чтобы справиться с этим тоже...

Ответ 2

Источник

Тип данных char основан на исходной спецификации Unicode, которая определяет символы как 16-битные объекты фиксированной ширины. Диапазон легальных кодовых пунктов теперь U + 0000 до U + 10FFFF, известный как скалярное значение Unicode.

Набор символов от U + 0000 до U + FFFF иногда называют базовой многоязычной плоскостью (BMP). Символы, чьи кодовые точки больше U + FFFF, называются дополнительными символами. Платформа Java 2 использует представление UTF-16 в массивах char и в классах String и StringBuffer. В этом представлении дополнительные символы представлены в виде пары значений char, первой из диапазона высоких суррогатов, (\ uD800-\uDBFF), второй из диапазона низких суррогатов (\ uDC00-\uDFFF).

Значение A char, следовательно, представляет собой пункты кода базовой многоязычной плоскости (BMP), включая суррогатные кодовые точки или кодовые единицы кодировки UTF-16. Значение int представляет все кодовые точки Unicode, включая дополнительные кодовые точки. Нижние (наименее значащие) 21 бит int используются для представления кодовых точек Unicode, а верхние (наиболее значительные) 11 бит должны быть равны нулю. Если не указано иное, поведение в отношении дополнительных символов и суррогатных значений char выглядит следующим образом:

  • Методы, принимающие только значение char, не могут поддерживать дополнительные символы. Они обрабатывают значения char из суррогатных диапазонов как символы undefined. Например, Character.isLetter('\ uD840') возвращает значение false, хотя это конкретное значение, если следовать за любым значением с низким суррогатом в строке, будет представлять букву.

  • Методы, принимающие значение int, поддерживают все символы Unicode, включая дополнительные символы. Например, Character.isLetter(0x2F81A) возвращает true, потому что значение кодовой точки представляет собой букву (идеолог CJK).

В документации по J2SE API кодовая точка Unicode используется для значений символов в диапазоне между U + 0000 и U + 10FFFF, а код кода Unicode используется для 16-разрядных значений char, которые являются кодовыми единицами UTF -16.

Ответ 3

Вместо использования StringBuilder вы также можете использовать функцию непосредственно найденный в классе Character. Функция toChars() и имеет следующую спецификацию:

Преобразует указанный символ (кодовая точка Юникода) в
его представление UTF-16, хранящееся в массиве {@code char}.

Итак, вам не нужно точно знать, как выглядят суррогатные пары как и непосредственно работать с кодовой точкой. Пример кода затем выглядит следующим образом:

int x = 0x10FFFF;
String y = new String(Character.toChars(ch));

Обратите внимание, что тип данных для кодовой точки - int, а не char.

Ответ 4

Символы Unicode могут принимать более двух байтов, которые не могут быть в общем случае в char.