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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

论坛已有这个题目的很多版本答案,这是我自己的思路,供大家探讨学习
package com.itheima;

public class Test10 {
/*
         *编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),
         * 例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
         *
         **/
    public static String Substring(String s, int length) throws Exception {

        byte[] bytesBuffer = s.getBytes("GBK");
        int bytesLength=bytesBuffer.length;
        if(bytesLength<length)
                return s;

       /* 采用统计汉子占用字节数的方法判断是否有半个汉子,一个汉子占用两个字节,且每个字节都小于0
         * 假如有半个汉子,则汉子字节数就是奇数,截取时去掉最后一个字节即可
         * 没有半个汉子,则汉子字节数就是偶数
         * */
        int index=0;
        int chineseCount=0;//统计汉子占用字节数
        while(index<bytesLength && length>0)
        {
                if(bytesBuffer[index]<0)
                    {
                            chineseCount++; //统计汉子的字节数,一个汉子占两个字节,每个字节都小于0,
                    }
                index++;
                length--;                  
        }
        if(chineseCount%2==1) //如果最后一个汉子的第一个字节恰巧在0--length内,则小于0的字节数是奇数,将来拷贝数据时去掉最后一个字节
        {
                index--;
        }

        return new String(bytesBuffer, 0, index, "GBK");

    }

    public static void main(String args[]) throws Exception {
        //测试字符串:HM程序员
            String s = "HM程序员";
        //根据想截取的字节数可设置大小,例如3
        String ss = Test10.Substring(s, 4);
        System.out.println(ss);
    }
}

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

3 个回复

倒序浏览
很实用的功能 学习了:)
回复 使用道具 举报
当时 基础测试时我就栽到这道题了  学习了
回复 使用道具 举报
我的基础测试也有这道题,不过我没学到字符串转字节数组呢,所以我用的是下面的方法。
  1. public class Test10{
  2.         public static void main (String[] args){
  3.                 String a = "G瑞d是gu德!";
  4.                 System.out.println(cutString(2,a));
  5.         }

  6.         static String cutString(int num, String a){               
  7.                 int offset=0;                       
  8.                 try{                       
  9.                         while(num > 0){               
  10.                                 if(a.charAt(offset)>127 && num > 1) {
  11.                                         //角标位长度两个字节,且可获取,角标+1,剩余可获取字节数-2
  12.                                         offset++;
  13.                                         num -= 2;
  14.                                 }
  15.                                 else if(a.charAt(offset) < 128 && num> 0){
  16.                                         //角标位长度一个字节,且可获取,角标+1,剩余可获取字节数-1
  17.                                         offset++;
  18.                                         num -= 1;
  19.                                  }
  20.                                 else
  21.                                         //角标位不可获取,剩余可获取字节数-1
  22.                                         num -= 1;
  23.                         }
  24.                 }
  25.                 catch(Exception e){
  26.                         //如果角标溢出了,则直接返回字符串
  27.                         return a;
  28.                 }
  29.                 //返回依照角标位获取的子串
  30.                         return a.substring(0,offset);
  31.         }
  32. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马