现在开发个应用,读取网页的内容,可是因为手机的内存关系,需要一部分一部分读,例如:设置len=1024,然后is.read(data, 0, len);下次再读的时候是从1024开始读,用的是is.skip(len);然后再调用is.read(data, 0, len); 
可是就会出现问题,第一次截取的时候到1024把汉字截断了,第二次再从1024开始取,以后的就会都是乱码,请问各位,如何解决,能截取出完整的汉字。

解决方案 »

  1.   


    我想了一下,只从最后判断不行。要从前面开始根据编码规则:字母的byte是单个的,数值为正数,如果转化为无符号那么数值小于128(0x80)
    汉字是双byte, 每个byte数值为负数, 如果转化为无符号那么数值大于等于128你就按照读取顺序,小于128就拿一个,不是就拿两个,一直到最后一个字节那里,如果需要拿两个,
    那么这个就是汉字的一部分,需要留给下一个段。以上只是针对字母与汉字,如果还有什么三字节,四字节,那判断规则还要增加
      

  2.   

    第一次截取的时候到1024把汉字截断了,第二次再从1024开始取
    先判断 如果是把汉字截断了 第二次 就从1024 + 1 出开始截
    这样应该可以 str.length 可以试试这个
    希望有所启发
      

  3.   

    给你个小例子
    public class test { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    String s = "ab我们de";
    byte[] bArray = s.getBytes();

    for (int i = 0; i < bArray.length; i++) {
    System.out.println(bArray[i]);
    }

    for (int i = 0; i < bArray.length; i++) {
    if (bArray[i] > 0) {
    transfer(bArray, i, true);
    }
    else {
    transfer(bArray, i, false);
    i++;
    }
    }
    }

    public static void transfer(byte[] bArray, int startNum, boolean isAlphabet) {
    byte[] alphaArray = new byte[2];
    if (isAlphabet) {
    alphaArray[1] = bArray[startNum];
    }
    else {
    alphaArray[0] = bArray[startNum];
    alphaArray[1] = bArray[startNum+1];
    }

    System.out.println(new String(alphaArray));
    }}
      

  4.   

    首先,你要判断是否为汉字,更准确的说是一个字节以上的都应该判断。因此,你可以采用下面代码:
    常识:ASCII码0-126的打印字符为单字节,以外的为两字节
      用这个方法判断。
      public isSingleBety(){}
       String   s="bbbb你好aaaa";   
       
       for(int i=0;i<s.lenght;i++){   
             
            int ii=(int)s.charAt(i);   
            if(ii<=0||ii>=126)   {
             System.out.println("字符为双字节 :"+charAt(i));                         
      } 
      }   
      参考这个应该可以搞定了吧。纯手工,有点乱,不对就砸。
      

  5.   

    楼上的为什么都以为网页的编码就是GBK活着GB2312呢?
    如果是UTF-8编码的话,那么判断起来就简单多了
    仅需要判断1024字节附近两到三个字节