byte[1024]数组循环转String出现一部分乱码。 5
InputStream is = connection.getInputStream();
//循环读取数据 存储到SB 开辟缓冲区。大小4K
byte[] bytes = new byte[4096];
int size = 0;
while ((size = is.read(bytes)) > 0) {
String str = new String(bytes, 0, size, "UTF-8");
System.out.println(str);
sb.append(str);
}
//关闭
is.close();
// 断开连接
connection.disconnect();
偶尔 少部分出现这种乱码 → 湖��
代码那里需要改进,项目全是UTF-8编码。 展开
使用字节流读取UTF-8编码的数据乱码。
首先了解编码 UTF-8 的产生
Unicode固定了编码方式,但是它的效率不高,如果是英语字母一个字节就可以了。多余的字节就浪耗了资源。
为了解决资源的浪费。出现了UTF-8编码,UTF-8可以根据不同的符号自动选择编码的长短。比如英文字母可以只用1个字节就够了。常用中文3个。
乱码产生的原因分析
当采用UTF-8编码时,如果固定了每次转换的字节数,那么各种类型的字符混用时有很大可能造成乱码。
比如每次读取2个字节。
如果存的是"AB",那么OK,不会乱码
如果存的是"A文",那么每次读取2个字节,A-->可以读出来A,但是“文”没有读取完整,只读了一个字节的信息,还有2个字节的信息没有读取。所以“文”就会出现乱码
解决办法:
方法一:
如果一定要byte[]数组来存在读取的数据,且数据量较小。那么可以扩大数组的容量,让byte[]数组能够存储所有的字节,然后在转换成字符
// 已知。数据约小于5kb,那么可以把byte数组大小定义成5KB,
byte[] bytes = new byte[1024*5];
把所有的数据全部读进去,然后转换成字符,那么不会出现乱码
方法二:
我们已经分析了UTF-8变长编码读取的一些问题,所以也可以从数据源的编码进行修改。
比如,把源头的编码改成固定长度的编码UTF-32或Uncoide等。
比如UTT-32,每个字符固定用4个字节存储,所以byte[]缓存区的大小,只需要设定为4的倍数。就可以确保不出现乱码
byte[] bytes = new byte[1024*4];//设置缓存区大小,习惯上设置成1024的倍数
方法三:
使用IO流中的字符流来包装字节流,最便利的就是使用BufferedReader来实现
InputStream is = connection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));
推荐使用方法三:最常用。最便利。
我用的是 字节流,以上代码可有 解决方法么?
用reader一行一行的读吧
BufferedReader reader = new BufferedReader(new InputStreamReader(is))
如果你一定要有用byte来读那么你就得自己判断什么地方是应该不应该放到下一次去转换string
2014-01-01
或者到回车换行再转换
byte buffer[] = new byte[is.available()]; //一次性转换依旧不行
int size = 0;
while ((size = is.read(buffer)) > 0) {
String str = new String(buffer, 0, size, "UTF-8");
sb.append(str);
}
可有方法指点
乱码还和网页的编码有关的了。
先确定网页的编码。网页的编码,是不是UTF-8