1.字符编码和字符集
字符编码:一套自然语言的字符与二进制之间的对应规则。
字符集:也叫编码表。生活中文字和计算机中二进制的对应规则。
常见字符集: 一套字符集必然至少有一套字符编码
(1)ASCII字符集(ASCII编码):7位(bits)表示一个字符,共128字符。扩展的字符集使用8位(bits)。
(2)GBK字符集(GBK编码):最常用的中文码表,双字节编码方案。
(3)Unicode字符集(UTF-8编码、UTF-16编码、UTF-32编码):表达任意语言的任意字符,标准万国码。
UTF-8编码:国际标准码表,电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码;所有互联网协议都必须支持UTF-8编码。编码规则(使用1至4个字节为每个字符编码):① 128个US-ASCII字符,只需一个字节编码。② 拉丁文等字符,需要二个字节编码。 ③ 大部分常用字(含中文),使用三个字节编码。 ④ 其他极少使用的Unicode辅助字符,使用四个字节编码。
2.编码引出的问题
在IDEA中使用FileReader可以读取默认编码格式(UTF-8)的文件;
FileReader读取系统默认编码(中文GBK)会产生乱码。
3.InputStreamReader类
public class FileReader extends InputStreamReader extends reader
构造方法:
InputStreamReader(InputStream in)
//创建一个inputstreamreader使用默认字符集(utf-8)。
InputStreamReader(InputStream in, String charsetName)
//创建一个inputstreamreader使用指定的字符集,charsetName为编码表名称。
注意事项: 构造方法中指定的编码表名称要和文件的编码相同,否则会发生乱码。
字节流通向字符流的桥梁:使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
读取原理(解码):
4.OutputStreamWriter类
public class FileWriter extends OutputStreamWriter extends writer
构造方法:
OutputStreamWriter(OutputStream out)
//创建一个outputstreamwriter使用默认的字符编码(utf-8)。
OutputStreamWriter(OutputStream out, String charsetName)
//创建一个outputstreamwriter使用指定的字符集。 charsetName为编码表名称,不区分大小写。
注意事项:
write()方法:把字符转换为字节,存储到缓冲区中;
flush()方法:把内存缓冲区中的字节刷新到文件中;
字符流通向字节流的桥梁:使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则接受平台默认的字符集。
写入原理(编码):