黑马程序员技术交流社区

标题: 请教怎样按字节数截取字符串 [打印本页]

作者: 陈国斌    时间: 2013-5-5 15:44
标题: 请教怎样按字节数截取字符串
请教怎样按字节数截取字符串?谢谢了
作者: zms2100    时间: 2013-5-5 16:01
Ls的又来占楼,.............。
好像有点难,我开头还以为是用提取字节然后存储字节数组,满一定字节数即可。
附上一解答的该问题的技术网址: http://blog.csdn.net/sunboyzsm/article/details/6999139 。
希望LZ看的懂(菜鸟一个,里面有些还不懂),抄Ls的常用语:  坐等大神来解答,O(∩_∩)O~
作者: 陈国斌    时间: 2013-5-5 16:03
ok,先表示感谢
作者: 陈国斌    时间: 2013-5-5 16:08
我也还很菜,感觉这个很吃力
作者: 陈国斌    时间: 2013-5-5 16:25
尹桥印 发表于 2013-5-5 15:52
占楼先。你试试这个

哥们挺牛啊!这么简单的代码就搞定了,但我还是不明白,bt[num] < 0这是什么意思啊?请指教
作者: 白磊    时间: 2013-5-5 16:26
这里关键就是汉字出现半个的那种情况不好弄。我是这么做的,我是对一个字符串进行遍历,每个字符得到他的字节数,并且每遍历一个字符就经所有便利过的字符的字节数进行累计,最后将在两种可能的情况下退出遍历。这两种情况是字节数刚好等于需要截取的字节数或者等于需要截取的字节数+1;根据这两种情况来截取字符串并退出遍历就可以了。我是这样做的。

public class Test10 {

        public static void main(String[] args) {
                System.out.println("请输入字符串和所需截取的字节数");
                //从键盘上输入
                Scanner zifuchuan = new Scanner(System.in);
                String str = zifuchuan.nextLine();
                Scanner zijieshu = new Scanner(System.in);
                int no = zijieshu.nextInt();
                System.out.println(str + ":::::" + no);
                isHanzi(str, no);       
        }

        public static void isHanzi(String s, int length) {
                int c = 0;
                int count1=0;  //count1用来存储读取的汉字的总字节数
                int count2=0;  //count2用来存储读取的其他字符的总字节数
                int num=0;     //num表示所有字符的总字节数
                int i = 0;     //i用来存储字符的个数
                StringBuffer sb=new StringBuffer();
                for ( ; i < s.length(); i++) {
                        char r= s.charAt(i);
                        c = (int)r;
                        //是汉字的时候
                        if (c <= 0 || c >= 126) {
                                char value = (char) c;
                                System.out.println(value);
                                count1+=2;
                                sb.append(r);
                        }
                        //不是汉字的时候
                        else{
                                count2++;
                                sb.append(r);
                        }       
                        num=count1+count2;
                        System.out.println(num);
                        //最后一个字符不是汉字的时候 输出的
                        if(num==length){
                                System.out.println(sb);
                                return;
                        }
                        //最后一个字符是汉字的时候 输出的
                        else if(num==(length+1)){
                                String str=sb.substring(0, i);
                                System.out.println(str);
                                return;
                        }
                }               
        }
}

作者: 陈国斌    时间: 2013-5-5 16:42
尹桥印 发表于 2013-5-5 16:32
那是一个字节型数组呐。应该说是把String类型的东西存入byte类型的数组里面,会出现负的。比如打印出来是 ...

哦,明白了!再次感谢

作者: xuluheng718    时间: 2013-5-5 17:31
因为要按照字节截取,假如字符串是中文呢?一个英文是一个字节,一个中文就有2个字节。
当字符串是中文的时候只截取到一半那么,截取到的一半就会出现乱码,按照你的要求可以用字节截取你字符串里面任意长度的字符串


String s = "你好2sfsgs爱哦焦点网shrfqwrafgaage";
  
  byte[] bt1 = s.getBytes();
            
  int num =0;//开始截取的位置
  int num1 =3;//需要截取的位置不包括要截取的位置
  byte[] bt2 ;
  if(num>=0&&num1<bt1.length&&(num1-num)>0)
  {
   //把截取的长度初始化
   bt2 = new byte[num1-num];
   //通过循环把截取到的字符存入到bt2中
   for(int j=0 ;num<=num1&&j<bt2.length;num++,j++)
   {
    bt2[j]=bt1[num];
   }
   System.out.println("字符编码:"+Arrays.toString(bt2));
   String s1 =new String(bt2);
   System.out.println(s1);
  }
  else
  {
   System.out.println("截取长度有误");
  }





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