Posted on 2006-10-13 09:57
风尘仆仆 阅读(2318)
评论(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 }