символ в Unicode больше, чем U + FFFF в Java? - PullRequest
12 голосов
/ 23 марта 2012

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

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

char u = '\u+10FFFF';

Ответы [ 4 ]

20 голосов
/ 23 марта 2012

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

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

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

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

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

4 голосов
/ 23 октября 2016

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

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

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

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

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

2 голосов
/ 23 марта 2012

Источник

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

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

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

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

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

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

1 голос
/ 23 марта 2012

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

...