Я пытался присвоить символов 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
?
Означает ли это, что символ не должен использоваться для представления символов Unicode?
Нет, символы Unicode на базовой многоязычной плоскости все еще могут быть представлены char
.
Должны ли мы всегда использовать int при работе с символами Unicode?
Нет, используйте String
с суррогатными парами. Например, используйте "\uD83C\uDF84"
для представления символа Unicode "CHRISTMAS TREE" (U + 1F384). Здесь есть хороший калькулятор суррогатной пары: http://www.russellcottrell.com/greek/utilities/SurrogatePairCalculator.htm
Что хорошего тогда имеет тип char?
Он все равно может представлять любой символ, который находится на базовой многоязычной плоскости.
String
int
?
int
, вам придется выполнить много сложных вычислений.
Это известная проблема в Java, и проблема устранена в разделе Unicode в учебниках Java:
Когда была создана спецификация языка Java, был принят стандарт Unicode, а примитив char был определен как 16-разрядный тип данных с символами в шестнадцатеричном диапазоне от 0x0000 до 0xFFFF.
Поскольку 16-разрядная кодировка поддерживает 216 (65 536) символов, что недостаточно для определения всех используемых символов во всем мире, стандарт Unicode был расширен до 0x10FFFF, который поддерживает более миллиона символов. Определение символа на языке программирования Java не может быть изменено с 16 бит на 32 бита без того, чтобы миллионы приложений Java перестали работать должным образом. Чтобы исправить определение, была разработана схема обработки символов, которые не могут быть закодированы в 16 бит.
Символы со значениями, которые находятся за пределами 16-битного диапазона и в пределах от 0x10000 до 0x10FFFF, называются дополнительными символами и определяются как пара значений char.
Следуйте приведенной выше ссылке для примеров кода и дополнительной информации.
char
является 16-битной, и когда Unicode был расширен для поддержки кодовых точек 0xFFFF
чем UCS-2, был заменен на UTF-16 (еще одна 16-битная кодировка), который теперь использует Java. UTF-16 обратно совместим с UCS-2 для 0x0000
- 0xFFFF
.
char
как одного недостаточно.