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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 夜hen冷 中级黑马   /  2014-11-14 18:45  /  1859 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文

评分

参与人数 1黑马币 +3 收起 理由
sk0806 + 3 神马都是浮云

查看全部评分

15 个回复

倒序浏览
一般GBK的编码汉字是两个字节,都为负数;
首先将获取字节数组,对字节数组进行循环,然后还要对循环中的元素字节,还要往前循环,如果字节值为负数,那么继续往前,如果为整数就停止,最终如果字节为负数出现的次数为偶数,那么就字节就取到这,如果为奇数就不取。
回复 使用道具 举报
还有GBK的编码汉字是两个字节,一负一正
回复 使用道具 举报
  1. public class Test {
  2.         public static void main(String[] args) {
  3.                 String str = "HM程序员";
  4.                 byte[] bytes = str.getBytes();
  5.                 byte[] result = new byte[bytes.length];
  6.                 // 要截取的长度
  7.                 int len = 3;
  8.                 for (int i = 0; i < len; i++) {
  9.                         if (bytes[i] > 0) {// 为字母
  10.                                 result[i] = bytes[i];
  11.                         } else if (bytes[i] < 0 && i + 1 < len) {// 为汉字的第一个字符且后一个字符还在要取的范围内
  12.                                 result[i] = bytes[i];
  13.                                 result[i + 1] = bytes[i + 1];
  14.                                 i++;
  15.                         }
  16.                 }
  17.                 System.out.println(new String(result));
  18.         }
  19. }
复制代码
回复 使用道具 举报
进来看看,学习学习
回复 使用道具 举报
扫地僧wu 来自手机 中级黑马 2014-11-16 17:22:14
地板
(づ ̄_3 ̄)づ 发表于 2014-11-14 19:14

基础测试最后一题都一样啊
回复 使用道具 举报
我是来学习的
回复 使用道具 举报
表示鸭梨山大
回复 使用道具 举报
public class Test {

        public static void main(String[] args) {

                String str = "HM程序员";

                byte[] bytes = str.getBytes();

                byte[] result = new byte[bytes.length];

                // 要截取的长度

                int len = 3;

                for (int i = 0; i < len; i++) {

                        if (bytes[i] > 0) {// 为字母

                                result[i] = bytes[i];

                        } else if (bytes[i] < 0 && i + 1 < len) {// 为汉字的第一个字符且后一个字符还在要取的范围内

                                result[i] = bytes[i];

                                result[i + 1] = bytes[i + 1];

                                i++;

                        }

                }

                System.out.println(new String(result));

        }

}
回复 使用道具 举报
恩,学习了
回复 使用道具 举报
新技能get了一个
回复 使用道具 举报
学习一下
回复 使用道具 举报
学习一下
回复 使用道具 举报
kakasa 中级黑马 2014-11-18 12:01:46
14#
  1. public static void main(String[] args) throws UnsupportedEncodingException
  2.         {
  3.                 String str="HM程序员";
  4.                 split(str,7);
  5.         }
  6.         public static void split(String str,int len) throws UnsupportedEncodingException
  7.         {
  8.                         byte[] buf=str.getBytes("gbk");
  9.                         System.out.println(Arrays.toString(buf));
  10.                         for(int x=0;x<len;x++)
  11.                         {
  12.                                 if(buf[x]>0)//大于0的英文字母直接打印。
  13.                                         System.out.print((char)buf[x]);
  14.                                 else
  15.                                 {
  16.                                         if(x+1<len)//汉字由两个字节组成,所以判断x+1后是否小于len,如果是就把x,x+1当作两个字节打印,否则break;退出。
  17.                                         {
  18.                                                 String temp=new String(new byte[]{buf[x],buf[x+1]},"gbk");
  19.                                                 System.out.print(temp);
  20.                                                 x=x+1;
  21.                                         }
  22.                                         else break;
  23.                                 }
  24.                         }
  25.         }
复制代码
回复 使用道具 举报
天天小志 来自手机 中级黑马 2014-11-18 12:10:36
15#
学习学习
回复 使用道具 举报
kerner 中级黑马 2014-11-18 14:25:17
16#
  1. public class CutByteCode {

  2.         public static void main(String[] args)  throws  IOException {
  3.                 String test = "ww琲琲你好lifang才";
  4.                 int len = test.getBytes().length;
  5.                 for(int i = 0 ; i < len; i++)       
  6.                 System.out.println("截取第"+(i+1)+"字节结果是:"+cutByteMethod(test, i+1, "gbk"));
  7.         }
  8.        
  9.         public static String cutByteMethod
  10.            (String name,
  11.                                            int len,
  12.                                                            String encode) throws IOException  {
  13.                
  14.                 byte[] buf = name.getBytes(Charset.forName(code));
  15.                 boolean flag = false;
  16.                 for(int i = 0; i < len; i++) {
  17.                         if(buf[i] < 0) {
  18.                                 flag = !flag;
  19.                                 if(flag&&buf[i+1]>0)
  20.                                         flag = true;
  21.                         }
  22.                         else
  23.                                 flag = false;                       
  24.                 }

  25.                 if(flag)
  26.                         return new String(buf, 0, len-1,code);
  27.                 else
  28.                         return new String(buf, 0, len, code);
  29.         }

  30. }
复制代码




回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马