首先了解编码 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为单位的多个数据块。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)