黑马程序员技术交流社区

标题: 大神帮忙解答一下小程序问题! [打印本页]

作者: 郭帅帅    时间: 2014-5-20 19:49
标题: 大神帮忙解答一下小程序问题!
本帖最后由 郭帅帅 于 2014-5-21 15:20 编辑
  1. package com.itheima;

  2. import java.io.ByteArrayInputStream;
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.IOException;

  5. public class Test10 {

  6.         /**
  7.          * 这个是从网上借鉴来的,不是太懂
  8.          * 编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),例如:
  9.          * 从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
  10.          * @param args
  11.          * @throws Exception
  12.          */
  13.         public static void main(String[] args) throws Exception {
  14.                 // TODO Auto-generated method stub
  15.                  String s = "HM程序员";
  16.                  System.out.println(subStrByByte(s, 3));           
  17.         }        
  18.         
  19.         //将截取字符串的方法封装成单独的函数;
  20.         public static String subStrByByte(String str, int bLen) throws Exception {
  21.                 //定义两个变量记录长度值;
  22.                    int preLen = 0;
  23.                    int len = 0;
  24.                    str = str.substring(0, bLen);
  25.                   
  26.                    //用GBK的码表将字符串添加到字节数组当中;
  27.                    byte[] b = str.getBytes("GBK");
  28.                    if(b.length == bLen) {
  29.                     return str;
  30.                    }
  31.                    //这个for循环里面的判断没搞懂!!!
  32.                    for(int i=0; i<str.length(); i++) {
  33.                            
  34.                            if(str.charAt(i) < 0 || str.charAt(i) > 127) {
  35.                                    len += 2;
  36.                            }
  37.                            else {
  38.                                     len += 1;
  39.                            }
  40.                            if(len > bLen) {
  41.                                     byte[] newB = new byte[preLen];
  42.                                     System.arraycopy(b, 0, newB, 0, preLen);
  43.                                     return new String(newB);
  44.                            }
  45.                            preLen = len;
  46.                            }
  47.                            return str;
  48.                         }
  49. }
复制代码

作者: 郭帅帅    时间: 2014-5-20 19:51
for循环里面的判断没搞懂,求解答
作者: Lin0411    时间: 2014-5-20 20:02
for(int i=0; i<str.length(); i++)   
{
     if(str[i] < 0 || str[i] > 127) //如果它是一个中文对应的字节
          len += 2;    //一个中文对应两个字节
     else
          len += 1;    //一个键盘字符对应一个字节
     if(len > bLen )  //如果已经达到要取得字节数
           {  
                      byte[] newB = new byte[preLen]; //创建一个存放指定字节数的字节数组
                      System.arraycopy(b, 0, newB, 0, preLen); //将指定长度为preLen的b数组中的字节拷贝到newB字节数组中
                        return new String(newB); //返回newB字节数组对应的字符串
           }
          else
             prelen  = len;  //否则记录现在已经取到的字节数
}
作者: 郭帅帅    时间: 2014-5-21 15:10
Lin0411 发表于 2014-5-20 20:02
for(int i=0; i 127) //如果它是一个中文对应的字节
          len += 2;    //一个中文对应两个字节
     ...

if(str < 0 || str > 127) //如果它是一个中文对应的字节,,这句不够准确。不过还是谢谢你的解答!
老实说你是不是按照字面意思理解啊?呵呵,不过,我刚上网查到了,这样的判断不是说字节,而是字符。
0-127对应的是ASCII码表中的占一个字节的字符,除此之外就不是占一个字节的字符了
str<0||str>127的意思是判断汉字用的,因为汉字这种字符不在0-127之间。




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