最近遇到个需求,由于表中某个字段类型时char而且为长度10,所以我后台获取的字符串需要截取最多到10位,否则存入数据库会报错,使用了String的substring方法获取的10个长度的内容,当其中包含中文时依然会报错,因为汉字在substring时按照一位获取的,但是存入数据库中是就是2位了,所以在substring时还要考虑是否其中包含汉字,以下的程序解决了该问题。
实现思路:
1,获取截取前字符串的byte序列
2,byte序列中如果包含汉字则是使用两个负数来存储
3,判断需要截取的位数前面有多少负数,如果是偶数个表面有1个或多个汉字,若是基数个则表明前面的内容中有半个汉字,如是直接获取则会出现乱码,所以需要获取位数-1。
实现的代码如下:
public class SplitTool {
public static String subString(String source,int byteNum) throws Exception{
String strResult = null;
byte bt[] = source.getBytes();
if(byteNum > bt.length){
throw new Exception("截取的位数超出字符串的长度!!!");
}
int cnt = 0;
for(int i=0;i<byteNum;i++) {
if(bt[i] < 0) {
cnt++;
}
}
if (byteNum > 1) {
if (bt[byteNum-1] < 0) {
if(cnt%2 ==0) {
strResult = new String(bt, 0, byteNum);
} else {
strResult = new String(bt, 0, --byteNum);
}
} else {
strResult= new String(bt, 0, byteNum);
}
} else {
if (byteNum == 1) {
if (bt[byteNum-1] < 0) {
strResult = new String(bt, 0, ++byteNum);
} else {
strResult = new String(bt, 0, byteNum);
}
} else {
throw new Exception("输入错误!!!请输入大于零的整数:");
}
}
return strResult;
}
public static void main(String[] args) throws Exception{
String result = SplitTool.subString("23这是测试数据:80101201035020100005",4);
System.out.println(result);
}
}