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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kitboxer 中级黑马   /  2015-4-10 14:22  /  1349 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 kitboxer 于 2015-4-10 14:25 编辑

思路跟网上常见的一样,具体方法不一样。测试通过,只是我自己都晕了,按理说若是汉字在前又指定开始的字节位置,可能截到汉字的低位,比如"大青果CH3CH3" 这个字符串,先GBK编码再转换成字节数组后,前六个字节都是汉字的,假如我指定从第一个字节开始截取,截取6个字节的长度,应该会把“大”截断,可我用这测试发现不会截断…………

  1. public class Test10 {
  2.         public static void main(String[] args) throws UnsupportedEncodingException   {
  3.                 String charCode=Charset.defaultCharset().name();//检测默认编码
  4.                 System.out.println("字符默认编码是"+charCode);
  5.                 Scanner input=new Scanner(System.in);
  6.                
  7. //                System.out.println("输入中英文混合字符串:");
  8. //                String str=input.next();
  9. //                System.out.println("输入开始截取的字节位置以及需要截取的字节数");
  10. //                int star=input.nextInt();
  11. //                int len=input.nextInt();
  12.                
  13.                 cutStringByBytes("HM程序员",0,3);        
  14.         }
  15.         private static void cutStringByBytes(String str,int star,int len) throws UnsupportedEncodingException{
  16.                 byte[] a= str.getBytes("GBK"); //转换成GBK码字节数组
  17.                 String b=new String(a,"GBK");//将这个字节数组转成GBK编码的字符串
  18.                 if(((star+len)<=a.length)&& len>=2){//起点加截取的长度不能超过数组的长度
  19.                         byte[]testA=Arrays.copyOfRange(a, star,star+len);//从起点开始复制,直到截断处
  20.                         String goal=new String(testA,"GBK");//将获得的字串转换成GBK编码的字符
  21.                         if(b.contains(goal)){//如果汉字没有被截断,则完整必然能转换成一个原字符串的子串,使用字符串的contains()方法检测。
  22.                                 System.out.println(goal);//因为没有截断汉字,可以直接输出;
  23.                         }else{
  24.                                 byte[] testB=Arrays.copyOfRange(a, star,star+len-1);//假如汉字被截断了,则舍弃这个字节
  25.                                 String c=new String(testB,"GBK");//将剩下的字节重新组装成GBK编码的字符
  26.                                 System.out.println(c);//输出
  27.                         }
  28.                 }
  29.                
  30.         }

  31. }
复制代码

4 个回复

倒序浏览
顶.........
回复 使用道具 举报

跑一跑,看一看,这段代码还是有些小问题:'(
回复 使用道具 举报
原题目是什么?
回复 使用道具 举报

有一个GBK编码的字母汉字混合的字符串,要求 输出为按字节截取的字符串。 但是要保证汉字不被截半个,
如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6, 应该输出为“我ABC”而不是“我ABC+汉的半个”
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马