字符流读取文本(含中文)产生乱码的原因

不要以为字符流读取文本(含有中文) 就不会有任何问题,如果你写(存)的编码和取(读)的编码不一致的话,其实也会造成乱码的现象这就跟我上次讲的那个String的编码和解码的问题是一样的,你存的时候用的UTF-8,你读的时候必须也用UTF-8,不要管它中间干了吗,只看头和尾的编码格式是否一致,接下来使用案例说明一下

案例一:读取一个文本(含中文)

准备工作

 

上述文件,我现在是使用UTF-8存储的,但是存储完之后,我将它的打开方式改为GBK (右键properties 改成GBK编码)

 

1.1:使用FileReader来读:存入和取出的编码一致

package crazy.java;

import java.io.FileReader;

public class Demo4 {

	public static void main(String[] args) throws Exception {
		
		//存的时候是UTF,那你就得用UTF解,不能用GBK
		FileReader fr = new FileReader("wzj");
		String encoding = fr.getEncoding();//本文件的编码格式
		System.out.println(encoding);
		
		char[] cbuf = new char[4];
		
		int len;
		while((len = fr.read(cbuf)) != -1) {
			System.out.print(new String(cbuf, 0, len));
		}
		
		fr.close();
	}
}

控制台输出结果: 

有的人可能会拿GBK来解,因为他看到那个文件的格式是GBK的(因为后来被我们手动改了),他心想只要两边编码一致就行了
可是却不知道,已经误解了一段话的意思,两边编码一致是指存入的编码和取出编码的时候,不管中间做了什么干扰都不要管,这里存入的时候,就是UTF-8,  只不过中间的编码的打开方式变化了,让我们误以为编码就被改了

 

 

1.2 使用FileReader来读:存入和取出的编码不一致

我把取出这边文件的编码改成GBK(右键,properties),取出的文件,就代表运行程序的这个文件

还是上面的代码,控制台输出效果

 

 

1.3 使用InputStreamReader来读(推荐)

因为使用FileReader来读的话, 如果想改取出的编码,还得右键properties,改编码,这倒 不麻烦
重要的是可能你之前写的中文注释,都会变成乱码,这样会得不偿失!!所以推荐使用InputStreamReader来读,
InputStreamReader,是Reader 的子类, 看它后面的Reader就知道了

构造方法:可以灵活的指定取出的编码!!

InputStreamReader(InputStream in, String charsetName)

代码:


/**
 * 编码问题:
 * 它写的时候是什么编码,你读的时候就用什么编码,你不要它管中间是如何干扰的
 *
 * @author 1
 *
 */
public class Demo3 {

	public static void main(String[] args) throws IOException {
		
		InputStreamReader isr = new InputStreamReader(new FileInputStream("wzj"),"GBk");
		System.out.println(isr.getEncoding());
		
		char[] cbuf = new char[1024];
		
		int len;
		while((len = isr.read(cbuf)) != -1) {
			System.out.print(new String(cbuf, 0, len));
		}
		
		isr.close();
	}
}

1.控制台输出:

这是因为存入的时候是UTF-8,而我代码中取出来却使用的是GBK,所以导致乱码!!!

 

2. 我将代码中取出来改成UTF-8,这样就存入和取出的编码一致了,就不会乱码了

   控制台输出:

 

  最后有什么写的不好的,希望各位可以不吝指出

  觉得对你有帮助的,想打赏的可以打赏一下,哈哈哈,多少无所谓,这也是对我一种支持与鼓励吗,最后不喜勿喷

有志同道合的小伙伴可以加QQ群讨论:897992110

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值