包含中文的字符串截取

最近遇到个需求,由于表中某个字段类型时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);
 }
}

原文地址:https://www.cnblogs.com/gmq/p/1747418.html