将大小为4个字节的Unicode字符分配给char

时间:2014-04-21 19:47:32

标签: java unicode

我尝试将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类型有什么用呢?

2 个答案:

答案 0 :(得分:3)

  

这是否意味着永远不应该使用char来表示Unicode字符?

不,Basic Multilingual Plane中的Unicode字符仍然可以由char表示。

  

在处理Unicode字符时我们应该总是使用int吗?

不,使用StringSurrogate 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值。

请按照上面的链接获取代码示例和更多信息。