黑马程序员技术交流社区
标题:
给你们分享一道题
[打印本页]
作者:
帮助信息
时间:
2015-11-30 08:38
标题:
给你们分享一道题
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");
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2