我知道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中的解释很费解。 请高手们指点一下,谢谢
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中的解释很费解。 请高手们指点一下,谢谢
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货