1. 程式人生 > >JAVA中String.length()中文只算一個位元組

JAVA中String.length()中文只算一個位元組

     最近在搞APK玩的時候遇到一個問題,java中String.length()函式計算中文字元時只算做一個字元長度,但是在c語言中,當我通過recv函式來讀取時,雖然字元長度可能少了,但是居然也能全部讀出來,這個還真沒搞懂,不過問題的關鍵不在這,關鍵是C語言中的strlen()函式計算字串長度時,由於是utf-8語言環境,中文是佔三個位元組的。所以長度不一致,導致服務端程式出錯。我服務端是通過一個while迴圈來讀取資料的,因為有遇到過資料比較大時,socket通道是分包傳送的,一次性讀取某個比較大的資料時,會發生丟資料的想象,雖然網上講(協議接收到的資料可能大於buf的長度,所以 在這種情況下要呼叫幾次recv函式才能把s的接收緩衝中的資料copy完。recv函式僅僅是copy資料,真正的接收資料是協議來完成的),但是我的buf長度足夠大,還是會丟失,具體原因也沒找到,總之,就多呼叫幾回recv就ok了 。言歸正傳,解決客戶端和服務端計算包含中文字串長度不一致的問題,我在客戶端通過計算字串中包含的中文字元個數*2+String.length()的方就解決了。  方法網上很多。

public int getChineseNum()

    {
          String regEx = "[\\u4e00-\\u9fa5]";
          Pattern p = Pattern.compile(regEx);
          Matcher m = p.matcher(s);
          while(m.find())
              count++;
          return count;    
    }