编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。
方法一
public class Tools {
public Tools() {
}
/**
* 字符串按字节截取
* @param str 原字符
* @param len 截取长度
* @return String
* @author kinglong
* @since 2006.07.20
*/
public static String splitString(String str, int len) {
return splitString(str, len, ".......");
}
/**
* 字符串按字节截取
* @param str 原字符
* @param len 截取长度
* @param elide 省略符
* @return String
* @author kinglong
* @since 2006.07.20
*/
public static String splitString(String str,int len,String elide) {
if (str == null) {
return "";
}
byte[] strByte = str.getBytes();
int strLen = strByte.length;
//int elideLen = (elide.trim().length() == 0) ? 0 : elide.getBytes().length;
if (len >= strLen || len < 1) {
return str;
}
/* if (len - elideLen > 0) {
len = len - elideLen;
} */
int count = 0;
for (int i = 0; i < len; i++) {
int value = (int) strByte[i];
if (value < 0) { //通过尝试发现(gb2312,utf8)汉字确实会占用多于一个字节(2,3),而且都是负值
count++;
}
}
if (count % 2 != 0) { //如果platform默认编码是utf8时会出错,某些置不能打印出汉字
len = (len == 1) ? len + 1 : len - 1;
}
return new String(strByte, 0, len) + elide.trim();
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Tools cs = new Tools();
//String s = "a加b等cc于c";
//String s = "a加b等cc于c";
String s ="aaas学位英语专区 学s位英语专区 学s位英语专区 学位英语专区";
try{
System.out.println(cs.splitString(s, 20));
}catch(Exception e){
e.printStackTrace();
}
}
}