Posted on 2006-10-13 09:57
風(fēng)塵仆仆 閱讀(2328)
評(píng)論(6) 編輯 收藏 所屬分類:
Java
String.substring(0, n)函數(shù)返回該字符串前n個(gè)字符的新字符串,但如果只想返回前n個(gè)字節(jié),而字符串中又含有中文等雙字節(jié)字符怎么辦呢,我寫(xiě)了個(gè)函數(shù),不過(guò)只假定參數(shù)字符串中只含有單字節(jié)和雙字節(jié)字符,不包含4字節(jié)的Unicode32。
例如:"我ABC是中國(guó)人DEF",截取5個(gè)字節(jié)應(yīng)返回"我ABC",截取6個(gè)字節(jié)應(yīng)返回"我ABC",截取7個(gè)字節(jié)應(yīng)返回"我ABC是"。
函數(shù)中主要是使用String.getBytes()判斷一個(gè)字符包含單節(jié)還是雙字節(jié),因?yàn)橐啻蝿?chuàng)建String字符,速度比較慢,誰(shuí)有更好的方法也請(qǐng)給出建議。
?1?static?final?String?subStringbyBytes(final?String?str,?final?int?bytes)?{
?2?????int?bytesCounter?=?0;
?3?????String?resStr?=?null;
?4?
?5?????//?首字符為雙字節(jié),?而要求輸出一個(gè)字節(jié)
?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???}