我知道Java的字符是采用UTF-16编码方式的Unicode字符码。也很清楚UTF-16编码方式(知道代码点和代码单元的意思)。但下面的问题我想不明白:
    
    Java 5.0 API中的codePointCount() 返回的是字符串在指定文本范围中的Unicode代码点数量。而不同于length返回的是字符串的代码单元数量。但是下面的代码让我费解:
    public static void main(String[] args){
String str1="\u1D56B";  //这个字符串中有一个Unicode编码表中附加级别的字符。(是一个数学符号)
String str2="\uD875\uDD6B";  //这个字符串是上面那个字符串采用UTF-16编码方法拆成的两个连续的代码单元中的值

System.out.println(str1.length());  //打印结果:2
System.out.println(str1.codePointCount(0,str1.length())); //打印结果:2 System.out.println(str2.length()); //打印结果:2
System.out.println(str2.codePointCount(0,str2.length())); //打印结果:1
   }   也就是说,对一个含附加级别的Unicode字符串,codePointCount()方法并没有和length()方法有什么不同,都是返回了代码单元数量,而把这个附加级别字符按UTF-16方法人工拆开之后统计字符串长度,这两个方法就有区别了,这个时候codePointCount()反映了附加级别的代码点数量。让我对JDK 5.0 API中的解释很费解。   请高手们指点一下,谢谢

解决方案 »

  1.   

    String str1="\u1D56B";  //这个字符串中有一个Unicode编码表中附加级别的字符。(是一个数学符号) ------------------------\u 后面只能跟 4 个字符,\u1D56B 表示的是 \u1D56 字符和字母 B,所以使用 codePointCount 获得的代码点数量就是 2 了。而第二种方式是采用代理对的方式来表示这个字符,虽然说采用两个 Unicode 的代理对来表示,但这只是表示 Unicode 中的一个代码点。PS:更正你一下你代码中的错误,U+1D56B 应采用的代理对为:U+D835 和 U+DD6B
      

  2.   

    太谢谢二楼的兄弟了,我明白了。如果我想编写Java程序打出U+1D568这个字符,怎么办。
      

  3.   

    这个字符在 Windows 平台上根本显示不了。位于 U+FFFF 编码以下的字符还不是全部能显示的。虽然说有些操作系统能支持 Unicode 字符,但也仅仅是从编码上支持,字符的显示需要有显示字库的支持,否则还是显示不出来。String str = new String(Character.toChars(0x1d56b));