JAVA中String.length()中文只算一個位元組
阿新 • • 發佈:2019-02-06
最近在搞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;
}