在计算字符串长度时,Java的两种方法length()和codePointCount()一度让我困惑,运行书上例子获得的长度值是相等的,那为何要设定两个方法呢?编码
对于普通字符串,这两种方法获得的值是同样的,但对于UniCode的编码来讲,仍是有一点区别。代理
经常使用的uniCode字符使用一个代码单元就能够表示,但有些辅助字符须要一对代码单元表示。code
好比整数集合的数学符号"Z"(没办法打出来),它的代码点是U+1D56B,但它的代理单元是U+D835和U+DD6B,若是令字符串str = "/u1D56B",机器识别的不是"Z",而是一个代码点”/u1D56“和字符”B“,因此会获得它的代码点数是2,代码单元数也是2。blog
但若是令字符str = "/uD835/uDD6B",那么机器会识别它是2个代码单元代理的1个代码点”Z“,故而,length的结果是代码单元数量2,而codePointCount()的结果是代码点数量1.索引
codePointAt(int index) 返回指定索引处的字符(Unicode 代码点)字符串
𫁝 ==\uD869\uDF17 ==\u2a717 |
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)); }