取指定的字符串,字符串里边有汉字和字母

取指定的字符串,字符串里面有汉字和字母

取指定的字符串,字符串里边有汉字和字母

解决问题之前,我们需要了解的是,在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 stub


String 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则为汉字,如果是首次出现的汉字字节则设置为true
bChineseFirstHalf=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