关于readline的乱码问题

cyberface 发布于 2016/10/12 20:07
阅读 984
收藏 0

@国栋 你好,想跟你请教个问题:

开发环境 eclipse

一个gbk的文档,里面是中文行,使用BufferedReader的readline来一行一行读成String,并打印。

若run configuration的Common项encoding设成gbk,即Charset.defaultCharset为utf8,控制台显示正常。

若run configuration的Common项encoding设成utf8,即Charset.defaultCharset为utf8,控制台显示乱码。

能分析下为什么吗?能否描述整个过程中所发生的所有转码?

我如下这做还是乱码,怎么样才能在Charset.defaultCharset为utf8时,对gbk文档readline不出现乱码?

while((l = readLine())!= null) {

   new String(l.getBytes("utf8"),"gbk"));

}




加载中
0
国栋
国栋
// 1.
    	FileInputStream fis = new FileInputStream("your_gbk_file");
    	
    	// 2. 根据文档的编码,构建与文档编码一致的 Reader,
    	// 也即显式地告诉 Reader,我要读取的文档所用的编码
    	InputStreamReader isr = new InputStreamReader(fis, "GBK");
    	// 不要这样!!!
    	//InputStreamReader isr = new InputStreamReader(fis);
    	// 这等价于
    	//InputStreamReader isr = new InputStreamReader(fis, "default_charset");
    	// 你不告诉它,它就用缺省。
    	// 当缺省编码与你要读取的文档编码不一致时就出错了!
    	// 所以不要依赖缺省编码!
    	
    	// 3. 用指定了编码的 Reader 来构建 BufferedReader
			BufferedReader br = new BufferedReader(isr);
			String l;
			while((l = br.readLine()) != null) {
			   System.out.println(l);
			}



0
国栋
国栋
你是怎么构建你的 BufferedReader的?你指定编码了吗?
0
cyberface
cyberface

@国栋 没有指定编码,就是

BufferedReader in = new BufferedReade(new FileReader(src));

while((l = in.readLine())!= null) {

   new String(l.getBytes("utf8"),"gbk"));

}

0
cyberface
cyberface

@国栋

谢谢,按你说的在最早处理字符串的接口处指定编码后乱码消失了。

但是我还是不理解为什么在不指定时,我后期处理不能消除乱码。

若不指定,readLine构造String是 -- gbk码值 -utf8-> unicode码点(乱码) -utf16-> utf16码值

然后我l.getBytes("utf8") -- utf16码值-utf16-> unicode码点(相同乱码) -utf8-> utf8码值

我认为这样做会转回原来的gbk码值,然后指定gbk构造String

然后new String(l.getBytes("utf8"),"gbk"));

gbk码值 -gbk-> gbk码点 -> unicode码点(正确)-> utf16码值

但现实情况是得到了乱码码点,我这样推理有什么错误吗?





国栋
国栋
如果事情不像你想象的那样,最大的可能就是你理解错了。你可以试着输出字节的值,看看是哪里错了
返回顶部
顶部