按字符数拆分字符串很简单,我这里要做的是按照字节数拆分字符串。按照我这里的编码,一个汉字占2个字节,一个字母、数字、空格等是占一个字节。拆分的原理就是,先计算出这段字符串总共占多少字节,然后再一段一段的截取。在截取某一段时,若是这一段的字节不够,就往后再截取。
1、下面这个函数是别人的,用来计算一段字符串占多少字节的。不管是汉字、字母、数字、空格、下划线等任何字符,只要在输入这段字符串时,某个字符是占多少字节,计算出来也是占多少字节。
//获取字符串的字节数
public static int getWordCount(String s)
{
s = s.replaceAll("[^\\x00-\\xff]", "**");
int length = s.length();
return length;
}
2、下面这一段代码则是将某段字符串按照指定的字节数拆分成一个字符串数组。比如说数组里面每一项都是60个字节(若是已经有59个字节了,而接下来的字符是一个占两个字节的字符,如汉字,则不截取,那么这一个数组项只有59个字节)。
/**
* 按字节数将string拆分
* author:陈同兵
* @param strContent
* @param maxLength 这是每个字符串的字节数
* @return
*/
public static String[] split1(String strContent,int maxLength){
if(org.apache.commons.lang.StringUtils.isBlank(strContent))return new String[]{};
if(maxLength<=0) return new String[]{strContent};
char[] xxxx = strContent.toCharArray();
int strlen=xxxx.length;//字符长度
int startIndex = 0,endIndex = 0;//字符数组的截取下标
java.util.List<String> list2 = new java.util.ArrayList();//用来存储截取后的字符串
char[] ch = null;
int b = 0;
for(int i = 0;i< strlen;){
//先按指定字节数截取一段字符,并转为串
endIndex = startIndex + maxLength/2;
ch = org.apache.commons.lang.ArrayUtils.subarray(xxxx, startIndex, endIndex);
//计算这段字符串的字节数
b = getWordCount(String.valueOf(ch));
//若它的字节数还不到指定的字节数,则进入while(){}里面继续往后截取
while((maxLength - b)>1){
endIndex = endIndex + (maxLength - b)/2;
if(endIndex >= strlen){
endIndex = strlen;
break;
}
ch = org.apache.commons.lang.ArrayUtils.subarray(xxxx, startIndex, endIndex);
b = getWordCount(String.valueOf(ch));
}
//在while里面得到合理的截取下标后,则进行截取,并放入list2里面去。
ch = org.apache.commons.lang.ArrayUtils.subarray(xxxx, startIndex, endIndex);
// System.out.println("被截取的字符串为=="+String.valueOf(ch));
list2.add(String.valueOf(ch));
startIndex = endIndex + 1;
i = startIndex;
if(endIndex >= strlen){
System.out.println("is over");
break;
}
}
return (String[]) list2.toArray(new String[list2.size()]);
}