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