- package com.itheima;
- import java.io.IOException;
- /**
- * 第10题:编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
- * @author Administrator
- *
- */
- public class Test10 {
- public static void main(String[] args) throws IOException{
- String str="HM程序员";
- //使用GBK编码取得字节数,然后取指定字节数的字符.
- for(int x=1;x<=str.getBytes("GBK").length;x++){
- System.out.println("用GBK码取"+x+"个字符的结果是:"+cutStringByGBK(str,x));
- }
- //使用UTF-8编码取得字节数,然后取指定字节数的字符.
- for(int x=1;x<=str.getBytes("UTF-8").length;x++){
- System.out.println("用UTF-8码取"+x+"个字符的结果是:"+cutStringByUTF_8(str,x));
- }
-
- }
- //使用UTF-8编码表取字符的方法.
- public static String cutStringByUTF_8(String str, int len) throws IOException {
- byte[] buf=str.getBytes("UTF-8");//将字符串转换成字节数组.
- int count=0;//定义一个计数器,记录负数字节出现的次数.
- for(int i=len-1;i>=0;i--){//从字节数组的最后一个成员开始判断,如果是负数,则计数器+1
- if (buf[i]<0)
- count++;
- else
- break;
- }
- if (count%3==0)//UTF-8编码表中汉字都是3个字节,如果出现负数字节的次数是3的倍数,表示所有字节都可以正常解码.
- return new String(buf,0,len,"UTF-8");
- else if (count%3==1)//如果出现负数字节的次数是3的倍数余1,舍弃一个字节
- return new String(buf,0,len-1,"UTF-8");
- else//如果出现负数字节的次数是3的倍数余2,舍弃两个字节
- return new String(buf,0,len-2,"UTF-8");
-
- }
- //使用GBK编码表取字符.
- public static String cutStringByGBK(String str,int len) throws IOException{
- byte[] buf=str.getBytes("GBK");//将字符串转换成字节数组.
- int count=0;//定义一个计数器,记录负数字节出现的次数.
- for(int i=len-1;i>=0;i--){//从字节数组的最后一个成员开始判断,如果是负数,则计数器+1
- if (buf[i]<0)
- count++;
- else
- break;
- }
- if (count%2==0)//GBK编码表中汉字都是2个字节,如果出现负数字节的次数是2的倍数,表示所有字节都可以正常解码.
- return new String(buf,0,len,"GBK");
- else//否则说明取到半个汉字,舍弃.
- return new String(buf,0,len-1,"GBK");
- }
- }
复制代码
|
|