unicode Java中求字符串長度length()和codePointCount()的區別

在計算字符串長度時,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));
}

相關文章
相關標籤/搜索