惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
小众软件
小众软件
博客园_首页
T
Tailwind CSS Blog
美团技术团队
博客园 - 叶小钗
Microsoft Security Blog
Microsoft Security Blog
有赞技术团队
有赞技术团队
Apple Machine Learning Research
Apple Machine Learning Research
大猫的无限游戏
大猫的无限游戏
Microsoft Azure Blog
Microsoft Azure Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
I
InfoQ
MongoDB | Blog
MongoDB | Blog
The Cloudflare Blog
J
Java Code Geeks
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
Blog — PlanetScale
Blog — PlanetScale
IT之家
IT之家
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Y
Y Combinator Blog

博客园 - 龚明秋

JavaScript获取客户端IP和MAC地址 java实现算术表达式求值 浅拷贝与深拷贝的实现 - 龚明秋 - 博客园 Table动态增加删除行 Java批量下载生成zip文件 JavaScript校验日期格式 使用过滤器来处理Session超时和权限管理 jsp页面内容导出到Excel中 - 龚明秋 - 博客园 Java读取Excel内容 Excel中如何根据身份证号码获取年龄,性别 坦克大战游戏-Java版 Java实现的简易文本编辑器 VB.NET实现的文本编辑器 串的模式匹配算法之二:首尾匹配算法 串的模式匹配算法之一:简单算法 Union Two Lists 有趣的猜数字游戏 用C#实现的简易计算器 用C#实现约瑟夫问题
包含中文的字符串截取
龚明秋 · 2010-05-30 · via 博客园 - 龚明秋

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