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

byte[1024]数组循环转String出现一部分乱码。,第1张

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

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

BYTE* buffer [1024] 只开辟了1个指针,32bit系统占用4个字节的内存。

这1个指针buffer指向了类型是BYTE [1024]的地址。

就是说buffer 可以被用来 *** 作 以每1K为单位的多个数据块。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9945671.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存