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

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


































原文地址:https://www.cnblogs.com/cxchanpin/p/7130324.html