我尝试将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字符?在处理Unicode字符时,我们是否应始终使用int
?
那么char
类型有什么用呢?
答案 0 :(得分:3)
这是否意味着永远不应该使用char来表示Unicode字符?
不,Basic Multilingual Plane中的Unicode字符仍然可以由char
表示。
在处理Unicode字符时我们应该总是使用int吗?
不,使用String
和Surrogate Pairs。例如。使用"\uD83C\uDF84"
表示Unicode字符'CHRISTMAS TREE'(U + 1F384)。这里有一个很好的代理对计算器:http://www.russellcottrell.com/greek/utilities/SurrogatePairCalculator.htm
那么char类型有什么用呢?
它仍然可以表示基本多语言平面中 的任何字符。
答案 1 :(得分:2)
这是Java中的一个已知问题,问题在Unicode section of the Java Tutorials:
中得到解决创建Java语言规范时,接受Unicode标准,并将char原语定义为16位数据类型,十六进制范围内的字符从0x0000到0xFFFF。
由于16位编码支持216(65,536)个字符,这不足以定义全世界使用的所有字符,因此Unicode标准扩展为0x10FFFF,支持超过一百万个字符。 Java编程语言中字符的定义无法从16位更改为32位,而不会导致数百万Java应用程序无法正常运行。为了纠正定义,开发了一种方案来处理无法以16位编码的字符。
值超出16位范围且在0x10000到0x10FFFF范围内的字符称为补充字符,并定义为一对char值。
请按照上面的链接获取代码示例和更多信息。