Posted on 2006-10-13 09:57
風塵仆仆 閱讀(2328)
評論(6) 編輯 收藏 所屬分類:
Java
String.substring(0, n)函數返回該字符串前n個字符的新字符串,但如果只想返回前n個字節,而字符串中又含有中文等雙字節字符怎么辦呢,我寫了個函數,不過只假定參數字符串中只含有單字節和雙字節字符,不包含4字節的Unicode32。
例如:"我ABC是中國人DEF",截取5個字節應返回"我ABC",截取6個字節應返回"我ABC",截取7個字節應返回"我ABC是"。
函數中主要是使用String.getBytes()判斷一個字符包含單節還是雙字節,因為要多次創建String字符,速度比較慢,誰有更好的方法也請給出建議。
?1?static?final?String?subStringbyBytes(final?String?str,?final?int?bytes)?{
?2?????int?bytesCounter?=?0;
?3?????String?resStr?=?null;
?4?
?5?????//?首字符為雙字節,?而要求輸出一個字節
?6?????if(bytes?==?1)?{
?7???????String?aChar?=?str.substring(0,?1);
?8???????byte[]?bytesInChar?=?aChar.getBytes();
?9?
10???????if(bytesInChar.length?==?2)
11?????????return?"";
12?????}
13?
14?????for(int?i?=?0;?i?<?str.length();?i++)?{
15???????String?aChar?=?str.substring(i,?i?+?1);
16???????byte[]?bytesInChar?=?aChar.getBytes();
17?
18???????if(bytesInChar.length?==?1)?{
19?????????//?single?byte?character
20?????????++bytesCounter;
21?
22?????????if(bytesCounter?==?bytes)?{
23???????????resStr?=?str.substring(0,?i?+?1);
24???????????break;
25?????????}
26???????}
27???????else?if(bytesInChar.length?==?2){
28?????????//?double?bytes?character
29?????????bytesCounter?+=?2;
30?
31?????????if(bytesCounter?>?bytes)?{
32???????????resStr?=?str.substring(0,?i);
33???????????break;
34?????????}
35?
36?????????if(bytesCounter?==?bytes)?{
37???????????resStr?=?str.substring(0,?i?+?1);
38???????????break;
39?????????}
40???????}
41?????}
42?
43?????return?resStr;
44???}