A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 帮助信息 中级黑马   /  2015-11-30 08:38  /  522 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package com.itheima;

  2. import java.io.IOException;


  3. /**
  4. * 第10题:编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
  5. * @author Administrator
  6. *
  7. */
  8. public class Test10 {

  9.         public static void main(String[] args) throws IOException{
  10.                 String str="HM程序员";
  11.                 //使用GBK编码取得字节数,然后取指定字节数的字符.
  12.                 for(int x=1;x<=str.getBytes("GBK").length;x++){
  13.                         System.out.println("用GBK码取"+x+"个字符的结果是:"+cutStringByGBK(str,x));
  14.                 }
  15.                 //使用UTF-8编码取得字节数,然后取指定字节数的字符.
  16.                 for(int x=1;x<=str.getBytes("UTF-8").length;x++){
  17.                         System.out.println("用UTF-8码取"+x+"个字符的结果是:"+cutStringByUTF_8(str,x));
  18.                 }
  19.                
  20.         }
  21.         //使用UTF-8编码表取字符的方法.
  22.         public static String cutStringByUTF_8(String str, int len) throws IOException {
  23.                 byte[] buf=str.getBytes("UTF-8");//将字符串转换成字节数组.
  24.                 int count=0;//定义一个计数器,记录负数字节出现的次数.
  25.                 for(int i=len-1;i>=0;i--){//从字节数组的最后一个成员开始判断,如果是负数,则计数器+1
  26.                         if (buf[i]<0)
  27.                                 count++;
  28.                         else
  29.                                 break;
  30.                 }
  31.                 if (count%3==0)//UTF-8编码表中汉字都是3个字节,如果出现负数字节的次数是3的倍数,表示所有字节都可以正常解码.
  32.                         return new String(buf,0,len,"UTF-8");
  33.                 else if (count%3==1)//如果出现负数字节的次数是3的倍数余1,舍弃一个字节
  34.                         return new String(buf,0,len-1,"UTF-8");
  35.                 else//如果出现负数字节的次数是3的倍数余2,舍弃两个字节
  36.                         return new String(buf,0,len-2,"UTF-8");
  37.                        
  38.         }
  39.         //使用GBK编码表取字符.
  40.         public static String cutStringByGBK(String str,int len) throws IOException{
  41.                 byte[] buf=str.getBytes("GBK");//将字符串转换成字节数组.
  42.                 int count=0;//定义一个计数器,记录负数字节出现的次数.
  43.                 for(int i=len-1;i>=0;i--){//从字节数组的最后一个成员开始判断,如果是负数,则计数器+1
  44.                         if (buf[i]<0)
  45.                                 count++;
  46.                         else
  47.                                 break;
  48.                 }
  49.                 if (count%2==0)//GBK编码表中汉字都是2个字节,如果出现负数字节的次数是2的倍数,表示所有字节都可以正常解码.
  50.                         return new String(buf,0,len,"GBK");
  51.                 else//否则说明取到半个汉字,舍弃.
  52.                         return new String(buf,0,len-1,"GBK");
  53.         }
  54. }


复制代码


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马