现在开发个应用,读取网页的内容,可是因为手机的内存关系,需要一部分一部分读,例如:设置len=1024,然后is.read(data, 0, len);下次再读的时候是从1024开始读,用的是is.skip(len);然后再调用is.read(data, 0, len);
可是就会出现问题,第一次截取的时候到1024把汉字截断了,第二次再从1024开始取,以后的就会都是乱码,请问各位,如何解决,能截取出完整的汉字。
可是就会出现问题,第一次截取的时候到1024把汉字截断了,第二次再从1024开始取,以后的就会都是乱码,请问各位,如何解决,能截取出完整的汉字。
我想了一下,只从最后判断不行。要从前面开始根据编码规则:字母的byte是单个的,数值为正数,如果转化为无符号那么数值小于128(0x80)
汉字是双byte, 每个byte数值为负数, 如果转化为无符号那么数值大于等于128你就按照读取顺序,小于128就拿一个,不是就拿两个,一直到最后一个字节那里,如果需要拿两个,
那么这个就是汉字的一部分,需要留给下一个段。以上只是针对字母与汉字,如果还有什么三字节,四字节,那判断规则还要增加
先判断 如果是把汉字截断了 第二次 就从1024 + 1 出开始截
这样应该可以 str.length 可以试试这个
希望有所启发
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));
}}
常识: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));
}
}
参考这个应该可以搞定了吧。纯手工,有点乱,不对就砸。
如果是UTF-8编码的话,那么判断起来就简单多了
仅需要判断1024字节附近两到三个字节