字符编码和字符集
字符编码的概述
计算机中储存的信息都是⽤⼆进制数表示的,⽽我们在屏幕上看到的数字、英⽂、标点符号、汉字等字符是⼆进制数转换之后的结果。按照某种规则,将字符存储到计算机中,称为编码。反之,将存储在计算机中的⼆进制数按照某种规则解析显示出来,称为解码 。⽐如说,按照A规则存储,同样按照A规则解析,那么就能显示正确的⽂本符号。反之,按照A规则存储,再按照B规则解析,就会导致乱码现象。
- 字符编码Character Encoding : 就是⼀套⾃然语⾔的字 符与⼆进制数之间的对应规则。
字符集的概述
字符集
Charset:也叫编码表。是⼀个系统⽀持的所有字符的集合,包括各国家⽂字、标点符号、图形符号、数字等
计算机要准确的存储和识别各种字符集符号,需要进⾏字符编
码,
⼀套字符集必然⾄少有⼀套字符编码。
常⻅字符集有
ASCII
字符集、
GBK
字符集、
Unicode
字符集等。
编码引出的问题
讲解 :
在
IDEA
中,使⽤
FileReader
读取项⽬中的⽂本⽂件。由于IDEA的设置,都是默认的
UTF-8
编码,所以没有任何问题。但是,当读取Windows
系统中创建的⽂本⽂件时,由于Windows系统的默认是
GBK
编码,就会出现乱码
public class Test07 {
public static void main(String[] args) throws IOException {
FileReader isr =new FileReader("C:\\Users\\25120\\IdeaProjects\\java\\5.txt");
int c;
while ((c=isr.read())!=-1) {
System.out.println((char) c );
}
isr.close();
}
}
InputStreamReader 类
InputStreamReader
类的概述
转换流
java.io.InputStreamReader
,是
Reader
的⼦类,是从字节流到字符流的桥梁。它读取字节,并使⽤指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集
InputStreamReader
类的构造⽅法
- InputStreamReader(InputStream in) : 创建⼀个使⽤默认字符集的字符流。
-
InputStreamReader(InputStream in, StringcharsetName) : 创建⼀个指定字符集的字符流。
构造举例:
InputStreamReader isr = newInputStreamReader ( newFileInputStream ( "in.txt" ));InputStreamReader isr2 = newInputStreamReader ( new FileInputStream ( "in.txt" ) , "GBK" );
InputStreamReader
类指定编码读取
public class Test07 {
public static void main(String[] args) throws IOException {
//转换流
//InputStreamReader类
//创建字符转换输入流对象。关联数据源文件路径平台默认编程,utf8
InputStreamReader isr =new InputStreamReader(new FileInputStream("C:\\Users\\25120\\IdeaProjects\\java\\5.txt"),"UTF-8");
int c;
while ((c=isr.read())!=-1) {
System.out.println((char) c );
}
isr.close();
}
}
OutputStreamWriter类
OutputStreamWriter
类的概述
转换流
java.io.OutputStreamWriter
,是
Writer
的⼦类,是从字符流到字节流的桥梁。使⽤指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集
OutputStreamWriter
类的构造⽅法
- OutputStreamWriter(OutputStream in) : 创建⼀个使 ⽤默认字符集的字符流。 idea默认的是utf8
-
OutputStreamWriter(OutputStream in, String charsetName) : 创建⼀个指定字符集的字符流
构造举例:
OutputStreamWriter isr = newOutputStreamWriter ( newFileOutputStream ( "out.txt" ));OutputStreamWriter isr2 = newOutputStreamWriter ( new FileOutputStream ( "out.txt" ) , "GBK" );
OutputStreamWriter
类指定编码读取
public class Test08 {
public static void main(String[] args) throws IOException {
//OutputStreamWriter
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("C:\\Users\\25120\\IdeaProjects\\java\\5.txt"), "UTF-8");
osw.write("中国");
osw.close();
}
}