解决这个问题之前,我们须要了解的是,在GBK字符集的编码中汉字占2个字节。字母和其它字符占一个字节,而在utf-8中汉字占3,或者4个字节,字母占2个字节,因为,utf一下占2个3个字节。一下占4个字节,不好拆分出指定的汉字加字母。所以才用gbk的编码格式,汉字占2个字节,字母一个字节。
在把汉字转换成字节的时候。输出的字节的值小于0,字母转换成字节的时候,输出的值就是其相应的数字。
在String对象中。它的长度计算,是汉字算一个,字母也算一个
代码例如以下:
package com.wj.demo1; public class SplitChinese { /*** @param args*/public static void main(String[] args) throws Exception{ // TODO Auto-generated method stubString st1="我a爱中华abc我爱传智def";String st2="a我ABC汉a";//定义的測试字符串String st3="ac23好11";System.out.println("str is "+st2.length());//无论是否是汉字。都仅仅占用一个字节,得到字符串的长度int num=trimGBK(st2.getBytes("GBK"),2);//得到应该截取的长度System.out.println(st2.substring(0, num));//输出指定的截取长度}public static int trimGBK(byte[] buf,int n){ int num=0;//标志变量,截取的长度boolean bChineseFirstHalf=false;//标志是否出现汉字System.out.println("the buf size is :"+buf.length);for(int i=0;i<n;i++){ System.out.println("byte[i]="+buf[i]);//打印相应的字节的值if(buf[i]<0&&!bChineseFirstHalf){//假设buf[i]<0则为汉字。假设是首次出现的汉字字节则设置为truebChineseFirstHalf=true;//2个字节的汉字首,出现的汉字字节}else{ num++;//累加,记录应该截取的长度bChineseFirstHalf=false;}}return num;//返回截取的长度} }
当int num=trimGBK(st2.getBytes("GBK"),2);/的时候输出为
str is 7 the buf size is :9 byte[i]=97 byte[i]=-50 a
当int num=trimGBK(st2.getBytes("GBK"),1);/的时候输出为
str is 7 the buf size is :9 byte[i]=97 a
当int num=trimGBK(st2.getBytes("GBK"),3);/的时候输出为
str is 7 the buf size is :9 byte[i]=97 byte[i]=-50 byte[i]=-46 a我
当int num=trimGBK(st2.getBytes("GBK"),4);/的时候输出为
str is 7 the buf size is :9 byte[i]=97 byte[i]=-50 byte[i]=-46 byte[i]=65 a我A
当int num=trimGBK(st2.getBytes("GBK"),6);/的时候输出为
str is 7 the buf size is :9 byte[i]=97 byte[i]=-50 byte[i]=-46 byte[i]=65 byte[i]=66 byte[i]=67 a我ABC
当int num=trimGBK(st2.getBytes("GBK"),7);/的时候输出为
str is 7 the buf size is :9 byte[i]=97 byte[i]=-50 byte[i]=-46 byte[i]=65 byte[i]=66 byte[i]=67 byte[i]=-70 a我ABC
当int num=trimGBK(st2.getBytes("GBK"),8);/的时候输出为
str is 7 the buf size is :9 byte[i]=97 byte[i]=-50 byte[i]=-46 byte[i]=65 byte[i]=66 byte[i]=67 byte[i]=-70 byte[i]=-70 a我ABC汉
当int num=trimGBK(st2.getBytes("GBK"),9);/的时候输出为
str is 7 the buf size is :9 byte[i]=97 byte[i]=-50 byte[i]=-46 byte[i]=65 byte[i]=66 byte[i]=67 byte[i]=-70 byte[i]=-70 byte[i]=97 a我ABC汉a