byte[1024]数组循环转String出现一部分乱码。 5

//读取响应获取InputStreamis=connection.getInputStream();//循环读取数据存储到SB开辟缓冲区。大小4Kbyte[]bytes=... // 读取响应 获取
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编码。
展开
 我来答
雪飞潇潇
推荐于2018-05-15 · TA获得超过6275个赞
知道大有可为答主
回答量:1968
采纳率:91%
帮助的人:879万
展开全部

使用字节流读取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"));

    推荐使用方法三:最常用。最便利。

敏杰软件
2014-01-01 · TA获得超过211个赞
知道小有建树答主
回答量:322
采纳率:0%
帮助的人:192万
展开全部
读进来的时候一次最多读1024字节,汉字在不同系统中点的字节数据是不同的,比较日文系统中一个汉字点3个字节,所以有可能遇到刚好读了2个字节进来,少字节了你去转成string当然就会是��
追问
我用的是 字节流,以上代码可有 解决方法么?
追答

用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
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式