关于使用InputStreamReader读取GBK编码文件乱码的问题

本文探讨了在Java中使用BufferedReader读取GBK编码文件时出现乱码的原因,并提出了解决方案。通过对比UTF-8和GBK编码下字节与字符的转换过程,解释了为何简单转码无法解决问题,强调了在创建Reader时指定正确编码的重要性。

Java代码:

BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(packageFilePath)));  

当使用此Reader读取GBK编码的文件时,所有的中文都会乱码,因为Reader会将读取到的byte转换成char,如果没有指定转换编码,那么默认是使用的utf8,那么读取到的内容就会错误。  

那么假如读取完毕后进行一次转码是否可以解决乱码问题呢? 

String s = readline();  
s = new String(s.getBytes("gbk"), "gbk");  

 思路是获得字符串的gbk编码,按照gbk编码重新解析一遍,实验证明是不可以的,是什么原因呢? 

举例说明: 

Java代码

byte ge[] = {(byte)0xb8, (byte)0xf6};  

这是汉字‘个’的gbk编码。 
String s = new String(ge, "gbk"); 
此时s不会是乱码。 

s.getBytes("utf8") //得到-28,-72,-86。‘个’的utf8编码  
s.getBytes("gbk") //得到0xb8,0xf6。‘个’的gbk编码  

而如果用一下代码生成s: 

String s = new String(ge, "utf8");  

此时s已经是乱码。 

s.getBytes("utf8") //得到-17,-65,-67,-17,-65,-67  

此时s的内容已经完全乱掉了,所以再用  s.getBytes("gbk");  得到的数据也是乱的,无法逆向出真正的内容来。 

所以要解决这个问题只能是让reader将byte转向char时使用正确的编码,即生成Reader时指定编码,即:

BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(packageFilePath), "gbk"));  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值