在计算字符串长度时,Java的两种方法length()和codePointCount()一度让我困惑,运行书上例子得到的长度值是相等的,那为什么要设定两个方法呢?
对于普通字符串,这两种方法得到的值是一样的,但对于UniCode的编码来说,还是有一点区别。
常用的uniCode字符使用一个代码单元就可以表示,但有些辅助字符需要一对代码单元表示。
比如整数集合的数学符号"Z"(没办法打出来),它的代码点是U+1D56B,但它的代理单元是U+D835和U+DD6B,如果令字符串str = "/u1D56B",机器识别的不是"Z",而是一个代码点”/u1D56“和字符”B“,所以会得到它的代码点数是2,代码单元数也是2。
但如果令字符str = "/uD835/uDD6B",那么机器会识别它是2个代码单元代理的1个代码点”Z“,故而,length的结果是代码单元数量2,而codePointCount()的结果是代码点数量1.
codePointAt(int index) 返回指定索引处的字符(Unicode 代码点)
String str = "我是中国人\uD869\uDF17"; final int count = str.codePointCount(0,str.length()); for(int i = 0;i<count;i++){ Integer codePoint = str.codePointAt(i); System.out.println("\\u"+Integer.toHexString(codePoint)); }