在IO流中对文本文件进行操作时,常常其中含有中文字符,而在对含有中文字符的文本文件进行操作时经常会出现乱码的情况出现。
譬如以下这个例子:
import java.io.FileInputStream;
import java.io.IOException;
public class ChineseCopyDemo {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("s.txt");
int by = 0;
while ((by = fis.read()) != -1) {
System.out.print((char) by);
}
fis.close();
}
}
如上例子在使用输入流读取s.txt文件时其中的中文字符出现了乱码的情况。
首先看一下编码和解码的问题:
(1)编码:将能看懂的字符串-------------->看不懂的字节数组
public byte[] getBytes(Charset charset)
将字符串转换成字节数组,指定编码格式(字符集)
(2)解码:将看不懂的字节数组------------->能看懂的字符串
public String (byte[] bytes, Charset charset)
通过使用指定的 编码格式 解码指定的 byte 数组,构造一个新的 字符串
例:编码:"明天吃排骨"----->字节数组----->二进制数据
解码:二进制数据----->十进制数据----->字节数组----->字符串(构造方式)
import java.io.IOException;
import java.util.Arrays;
public class ChineseCopyDemo {
public static void main(String[] args) throws IOException {
String str = "明天吃排骨" ;
//编码 public byte[] getBytes(Charset charset)
byte[] bys = str.getBytes("utf-8"); //如果不写编码格式,默认为GBK格式
System.out.println(Arrays.toString(bys)); //utf-8编码集一个中文对应三个字节
//解码 public String(byte[] bytes, Charset charset)
String s = new String(bys, "utf-8") ;
System.out.println(s);
}
}
中文左边对应的字节是负数
GBK编码格式右边的字节可以是正数,可以是0,也可以是负数
字节流一次读取一个字节,出现中文乱码的原因:
给字节进行强制类型转换,而其中含有中文,并且平台默认的编码集为GBK格式(一个中文对应两个字节)。
而使用字符流进行文本文件的操作,字符流的构造方式中指定了编码的格式,所以运行时不会出现乱码的情况。
public OutputStreamWriter(OutputStream out,Charset cs) 创建使用给定字符集的 OutputStreamWriter
注:charset为给定的编码集格式
结论:针对文本文件进行操作时,为避免出现中文乱码,应使用字符流来进行操作
常见的编码表: