Назначение символа Unicode размером 4 байта для символа

1

Я пытался присвоить символов Unicode 0x10FFFF к char, но он потерпел неудачу с ошибкой:

 public static void main(String []args){
         char a = 0x10FFFF;
         int b=a;
        System.out.println("b="+b+", but a="+a);
 }

Ошибка:

HelloWorld.java:4: error: possible loss of precision
         char a=   0x10FFFF;
                   ^
  required: char
  found:    int
1 error

Теперь я знаю, что верхняя граница для char равна 65 535, поскольку для хранения используется 16 бит.

Означает ли это, что char не должен использоваться для представления символов Unicode? Должны ли мы всегда использовать int при работе с символами Unicode?
Что хорошего тогда имеет тип char?

  • 0
    Когда вы добавляете такую кодовую точку в строку, она использует два char как одного недостаточно.
Теги:
unicode

2 ответа

3

Означает ли это, что символ не должен использоваться для представления символов Unicode?

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

Должны ли мы всегда использовать int при работе с символами Unicode?

Нет, используйте String с суррогатными парами. Например, используйте "\uD83C\uDF84" для представления символа Unicode "CHRISTMAS TREE" (U + 1F384). Здесь есть хороший калькулятор суррогатной пары: http://www.russellcottrell.com/greek/utilities/SurrogatePairCalculator.htm

Что хорошего тогда имеет тип char?

Он все равно может представлять любой символ, который находится на базовой многоязычной плоскости.

  • 0
    Почему вы бы порекомендовали использовать String int ?
  • 0
    @nwellnhof Поскольку строки предназначены для хранения не-BMP символов, и суррогатная пара в строке может быть напечатана без каких-либо проблем. Чтобы напечатать не-BMP символ, представленный как int , вам придется выполнить много сложных вычислений.
Показать ещё 1 комментарий
2

Это известная проблема в Java, и проблема устранена в разделе Unicode в учебниках Java:

Когда была создана спецификация языка Java, был принят стандарт Unicode, а примитив char был определен как 16-разрядный тип данных с символами в шестнадцатеричном диапазоне от 0x0000 до 0xFFFF.

Поскольку 16-разрядная кодировка поддерживает 216 (65 536) символов, что недостаточно для определения всех используемых символов во всем мире, стандарт Unicode был расширен до 0x10FFFF, который поддерживает более миллиона символов. Определение символа на языке программирования Java не может быть изменено с 16 бит на 32 бита без того, чтобы миллионы приложений Java перестали работать должным образом. Чтобы исправить определение, была разработана схема обработки символов, которые не могут быть закодированы в 16 бит.

Символы со значениями, которые находятся за пределами 16-битного диапазона и в пределах от 0x10000 до 0x10FFFF, называются дополнительными символами и определяются как пара значений char.

Следуйте приведенной выше ссылке для примеров кода и дополнительной информации.

  • 0
    Эта документация просто использует много причудливых формулировок, но она сводится к тому факту, что Java изначально была разработана для UCS-2 (16-битная кодировка), поэтому char является 16-битной, и когда Unicode был расширен для поддержки кодовых точек 0xFFFF чем UCS-2, был заменен на UTF-16 (еще одна 16-битная кодировка), который теперь использует Java. UTF-16 обратно совместим с UCS-2 для 0x0000 - 0xFFFF .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню