黑马程序员技术交流社区

标题: 测试题最后一道 [打印本页]

作者: 夜hen冷    时间: 2014-11-14 18:45
标题: 测试题最后一道
编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
作者: zhangyangLengen    时间: 2014-11-14 18:53
一般GBK的编码汉字是两个字节,都为负数;
首先将获取字节数组,对字节数组进行循环,然后还要对循环中的元素字节,还要往前循环,如果字节值为负数,那么继续往前,如果为整数就停止,最终如果字节为负数出现的次数为偶数,那么就字节就取到这,如果为奇数就不取。
作者: zhangyangLengen    时间: 2014-11-14 18:55
还有GBK的编码汉字是两个字节,一负一正
作者: (づ ̄_3 ̄)づ    时间: 2014-11-14 19:14
  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. }
复制代码

作者: 时间都去哪了    时间: 2014-11-15 21:55
进来看看,学习学习

作者: 扫地僧wu    时间: 2014-11-16 17:22
(づ ̄_3 ̄)づ 发表于 2014-11-14 19:14

基础测试最后一题都一样啊
作者: Afridoce    时间: 2014-11-16 18:05
我是来学习的
作者: 想成为黑马    时间: 2014-11-16 20:16
表示鸭梨山大
作者: 郑泽霖    时间: 2014-11-17 14:57
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));

        }

}
作者: 孟育俊    时间: 2014-11-17 17:08
恩,学习了
作者: touch_world    时间: 2014-11-17 20:23
新技能get了一个
作者: 范中俊    时间: 2014-11-17 22:30
学习一下
作者: 范中俊    时间: 2014-11-17 22:31
学习一下
作者: kakasa    时间: 2014-11-18 12:01
  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
学习学习
作者: kerner    时间: 2014-11-18 14:25
  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. }
复制代码









欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2