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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 478883662 中级黑马   /  2015-11-10 23:34  /  954 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表)
这道应该是在截取的过程中要判断是否为中文把,但是如何判断呢?

5 个回复

倒序浏览
/**
*   键盘录入String类型的字符串,再键盘录入一个int型n的数字,这个数字是确定提取的字节数n(判定字节长度)
*   将字符串封装成byte数组,并且取出n个元素提取出来赋值给新的数组。
*   
*   对数组进行遍历,找到截取(n)的字节中,有多少个小于0 的个数count
*   
*           如果byte数组最后一位小于0,且如果小于0的元素为奇数个。数组元素最后一位去掉,然后打印。
*                  
*           else 直接打印。
*                  
*   
*
*/

public class Demo22 {
        public static void main(String[] args) {
                Scanner sc = new Scanner(System.in);
       
                String s=sc.nextLine();
                int n=sc.nextInt();
               
        //byte数组
                byte[] bytes = s.getBytes();
               
                //判定截取的字节数量是否大于录入的字符串字节数
                if(n>=bytes.length){
                        System.out.println(s);
                }else{
                        //找到截取的字节中,有多少个小于0 的个数count
                        int count=fun1(bytes,s,n);
                        //
                        fun2(n, bytes,count) ;
                       
                }
               
        }


        private static int fun1(byte[] bytes, String s, int n) {
               
//                System.out.println(Arrays.toString(bytes));
                //声明一个变量count,获取截取的字节中小于0的个数
                int count=0;
                for(int i=0;i<n;i++){
                        if(bytes[i]<0){
                                count++;
                        }
                       
                }
//                System.out.println(count);
                return count;
               
        }



        private static void fun2(int n, byte[] bytes, int count) {
                if(bytes[n-1]<0 && (count%2)==1){
                        String str = new String(bytes,0,--n);
//                        System.out.println(str.length());
                        System.out.println(str);
                       
                }else{
                       
                        String str = new String(bytes,0,n);
//                        System.out.println(count);
                        System.out.println(str);
                }
        }
}
回复 使用道具 举报
因为字符串转换byte数组后,如果是中文,那么会有两个字节来表示(默认gbk),所以可以根据截取的字节里面,最后一位元素是否为负数来判定最后一位是否为中文,,然后如果是中文,根据截取的数组中,负数的奇偶性来判断是否会截取到半个中文.
回复 使用道具 举报
零尘 发表于 2015-11-11 00:44
因为字符串转换byte数组后,如果是中文,那么会有两个字节来表示(默认gbk),所以可以根据截取的字节里面,最后 ...

中文的半个字节是小于零的。。。o了  谢谢
回复 使用道具 举报
零尘 发表于 2015-11-11 00:42
/**
*   键盘录入String类型的字符串,再键盘录入一个int型n的数字,这个数字是确定提取的字节数n(判定字 ...

太谢谢你了,很详细
回复 使用道具 举报
本帖最后由 黑夜中那颗星 于 2015-11-11 15:54 编辑

这是我在网上查的,给了我启发,我看到有说用contians方法的,我瞬间就明白了
  1. //编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表)
  2. public class Test {
  3.         public static void main(String[] args) throws Exception {
  4.                 String str = "HM程序员h";
  5.                 System.out.println(demo(str,7));
  6.         }
  7.         public static String demo(String str,int num) throws Exception{
  8.                 byte[] b = str.getBytes("GBK");
  9.                 if(num<=b.length){
  10.                         if(str.contains(new String(b,0,num))){        //因为GBK里面中文是2个字节,字母是1个字节,如果取出的正确的打字符串里肯定会包含(contians方法)该子串
  11.                                 //因为取出的有问题的话肯定不会包含改子串
  12.                                 return new String(b,0,num);        //没问题就直接返回截取的
  13.                         }
  14.                         else{
  15.                                 return new String(b,0,num-1);        //有问题的话就说明截取到半个中文了,然后减一个字节就好了
  16.                         }
  17.                 }
  18.                 return "";
  19.         }
  20. }
复制代码



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