Подтвердить что ты не робот

Кодировка Java Unicode

Java char 2 байта (максимальный размер 65 536), но есть 95,221 Символы Unicode. Означает ли это, что вы не можете обрабатывать определенные символы Unicode в приложении Java?

Это зависит от того, какую кодировку символов вы используете?

4b9b3361

Ответ 1

Вы можете обработать их все, если будете достаточно осторожны.

Java char - это блок кода UTF-16. Для символов с кодовой точкой > 0xFFFF он будет закодирован с помощью 2 char (суррогатная пара).

См. http://www.oracle.com/us/technologies/java/supplementary-142654.html для обработки этих символов в Java.

(BTW, в Unicode 5.2 имеется 107 154 назначенных символов из 1114 112 слотов.)

Ответ 2

Java использует UTF-16. Единая Java char может представлять только символы из базовой многоязычной плоскости. Другие символы должны быть представлены суррогатной парой из двух char s. Это отражается в методах API, таких как String.codePointAt().

И да, это означает, что много кода Java будет так или иначе ломаться при использовании с символами вне базовой многоязычной плоскости.

Ответ 3

Чтобы добавить к другим ответам, необходимо запомнить следующие моменты:

  • A Java char занимает всегда 16 бит.

  • A Юникод-символ, когда он кодируется как UTF-16, принимает "почти всегда" (не всегда) 16 бит: это потому, что есть более чем 64K символов Unicode. Следовательно, Java char НЕ является символом Unicode (хотя "почти всегда" есть).

  • "Почти всегда", выше, означает 64K первых кодовых точек Unicode, от 0x0000 до 0xFFFF (BMP) которые принимают 16 бит в кодировке UTF-16.

  • Символ Unicode без BMP ( "редкий" ) представлен как два символа Java (суррогатное представление). Это также относится к буквальному представлению в виде строки: Например, символ U + 20000 записывается как "\uD840\uDC00" .

  • Корреляция: string.length() возвращает количество символов java, а не символов Unicode. Строка, имеющая только один "редкий" символ юникода (например, U + 20000), вернет length() = 2. То же самое относится к любому методу, который имеет дело с char -sequences.

  • Java не имеет большого интеллекта для работы с символами unicode без BMP в целом. Существуют некоторые методы утилиты, которые обрабатывают символы как кодовые точки, представленные как int, например: Character.isLetter(int ch). Это реальные полностью-юникодные методы.

Ответ 4

Посмотрите Поддержка Unicode 4.0 в J2SE 1.5, чтобы узнать больше о трюках, изобретенных Sun, для поддержки всех Unicode 4.0.

В итоге вы найдете следующие изменения для Unicode 4.0 в Java 1.5:

  • char - это код кода UTF-16, а не кодовая точка
  • новые низкоуровневые API-интерфейсы используют int для представления кодовой точки Unicode
  • API-интерфейсы высокого уровня были обновлены для понимания суррогатных пар.
  • предпочтение в отношении API-интерфейсов последовательности char вместо методов char

Так как Java не имеет 32-битных символов, я позволю вам судить, можем ли мы назвать эту хорошую поддержку Unicode.

Ответ 5

Здесь документация Oracle на Обозначения символов Unicode. Или, если хотите, более подробную документацию здесь.

Тип данных char (и, следовательно, значение, которое имеет объект Character инкапсуляция) основаны на исходной спецификации Юникода, которая определенные символы как 16-битные объекты фиксированной ширины. Юникод с тех пор этот стандарт был изменен, чтобы для представления требуется более 16 бит. Диапазон юридического кода точки теперь U + 0000 до U + 10FFFF, известный как скалярное значение Unicode. (Обратитесь к определению нотации U + n в стандарте 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, поддерживают все символы Юникода, включая дополнительные символы. Например, Character.isLetter(0x2F81A) возвращает true, потому что значение кодовой точки представляет собой письмо (идеолог CJK).

Ответ 6

Из Документация OpenJDK7 для String:

Строка представляет собой строку в Формат UTF-16, в котором дополнительные символы представлены суррогатные пары (см. раздел Представления символов Unicode в класс Character для более Информация). Значения индекса относятся к char единиц кода, поэтому дополнительная символ использует две позиции в Строка.