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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 David.L 于 2014-10-6 20:32 编辑

自己写的代码分享,欢迎探讨指导

  1. package com.itheima;

  2. /*
  3. * 10、编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),
  4. * 例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文.
  5. *
  6. * 思路:
  7. * 1,GBK编码表中,汉字由2字节表示,且2个字节前的最高位都是1,在byte类型中,最高位1代表负数
  8. * 2,字母和数字都是一个字节,用一个正数表示。
  9. * 3,java默认编码是unicode,所以获取字节数组时需要指定GBK编码
  10. * */
  11. public class Test10 {

  12.         public static void main(String[] args) {
  13.                
  14.                 //调用函数,输出测试
  15.                 System.out.println(mySubstring("HM程序员最牛X",2));
  16.                 System.out.println(mySubstring("HM程序员最牛X",4));
  17.                 System.out.println(mySubstring("HM程序员最牛X",3));
  18.                 System.out.println(mySubstring("HM程序员最牛X",10));
  19.         }
  20.         
  21.         //定义一个方法,接收原始字符串和需要截取的字节数,返回截取到的字符串
  22.         public static String mySubstring(String str,int count) {
  23.                
  24.                 //定义一个byte[]
  25.                 byte[] bytes = null;
  26.                 //获取字节数组时,指定为按GBK编码获取,需要处理不支持GBK的机子上的异常
  27.                 try {
  28.                         bytes = str.getBytes("GBK");
  29.                 } catch (Exception e) {
  30.                         // TODO Auto-generated catch block
  31.                         e.printStackTrace();
  32.                 }
  33.                 //判断输入的字节个数是不是正整数
  34.                 if(count<0)
  35.                         throw new RuntimeException("获取字节个数为负数,错误!");
  36.                 //判断输入的字节个数是否大于原始字符串长度,是,则输出原字符串
  37.                 else if(count>str.length())
  38.                         return str;
  39.                 //判断输入的字节个数是不是奇数
  40.                 else if(count>0 && count%2==1) {
  41.                         //是奇数,才判断要获取的最后一个字节是不是汉字的一半,通过负数判断
  42.                         if((byte)bytes[count-1]<0){
  43.                                 //是汉字一半,就减一个字节
  44.                                 count--;
  45.                         }
  46.                 }
  47.                
  48.                 //获取要得到的新字节数组
  49.                 byte[] newbytes=new byte[count];
  50.                 for(int x=0;x<count;x++){
  51.                         newbytes[x]=bytes[x];
  52.                 }
  53.                
  54.                 //将新字节数组转回字符串,并返回
  55.                 String newStr=new String(newbytes);
  56.                 return newStr;
  57.         }

  58. }
复制代码


0 个回复

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