1.字符编码:就是一套自然语言的字符与二进制数之间的对应规则。
编码表:生活中文字和计算机中二进制的对应规则。
编码:按照某种规则,将字符存储到计算机中。
解码:将存储在计算机中的二进制数按照某种规则解析出来。
2.字符集charset:也叫编码表。是一个系统支持的所有字符的集合,包括各国家的文字、标点符号、图形符号、数字等。
常见的字符集有:ASCII字符集、GBK字符集、Unicode字符集(utf-8、utf-166、utf-32)
GBK:2个字节
UTF-8:3个字节
3.编码引出的问题:在IDEA中,使用FileReader读取项目中的文本文件。由于IDEA的设置,都是默认的UTF-8,所以没有任何问题。但是,当读取Windows系统中创建的文本文件时,由于Windows系统默认是GBK编码,就会出现乱码。
4.OutputStreamWriter 编码(看懂的变成看不懂的)
是字符流通向字节流的桥梁,可使用指定的charset
构造方法:(1)OutputStreamWriter(OutputStream out);创建使用默认字符编码的OutputStreamWriter
(2)OutputStreamWriter(OutputStream out,String charsetName);选用指定的字符集
public static void main(String[] args) throws IOException {
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("dos.dat"),"utf-8");
osw.write("你好");
osw.flush();
osw.close();
}
5.InputStreamReader 解码(看不懂的变成能看懂的)
是字节流通向字符流的桥梁,可使用指定的charset
构造方法:(1)InputStreamReader (InputStreamReader in);创建使用默认字符编码的OutputStreamWriter
(2)InputStreamReader (InputStreamReader in,String charsetName);选用指定的字符集
注意:构造方法中指定的便秘吗表名称要和文件的编码相同,否则会发生乱码
public static void main(String[] args) throws IOException {
InputStreamReader isr = new InputStreamReader (new FileInputStream("dos.dat"),"utf-8");
int len = 0;
while((len = isr.read()) != -1) {
System.out.println((char)len);
}
isr.close();
}
6.转换文件编码
public static void main(String[] args) throws IOException {
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("dos.dat"),"GBK");
InputStreamReader isr = new InputStreamReader (new FileInputStream("dos1.dat"),"utf-8");
int len = 0;
while((len = isr.read()) != -1) {
osw.write(len);
}
osw.close();
isr.close();
}