一,字符编码和字符集
编码:按照某种规则,将字符存储到计算机中;
解码:,将存储在计算机中的二进制数按照某种规则解析显示出来。
字符编码 : 就是一套自然语言的字符与二进制数之间的对应规则。
字符集:也叫编码表。是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等。
常见字符集:
1,ASCII字符集:主要包括控制字符(回车键、退格、换行键等)和可显示字符(英文大小写字符、阿拉伯数字和西文符号);
2,GBK字符集:最常用的中文码表。是在GB2312标准基础上的扩展规范,使用了双字节编码方案,共收录了21003个汉字,完全兼容GB2312标准,同时支持繁体汉字以及日韩汉字等。
3,Unicode字符集:为表达任意语言的任意字符而设计,是业界的一种标准,也称为统一码、标准万国码。它最多使用4个字节的数字来表达每个字母、符号,或者文字。有三种编码方案,UTF-8、UTF-16和UTF-32。最为常用的UTF-8编码。
UTF-8编码编码规则:
1,128个US-ASCII字符,只需一个字节编码。
2,拉丁文等字符,需要二个字节编码。
3,大部分常用字(含中文),使用三个字节编码。
4,其他极少使用的Unicode辅助字符,使用四字节编码。
FileReader可以读取IDE默认编码格式的(UTF-8)的文件,FileReader读取系统默认默认编码(中文GBK)会产生乱码。
二,OutputStreamWriter
java.io.OutputStreamWriter extends Writer.
OutputStreamWriter :是字符流通向字节流的桥梁,可使用指定的charset将要写入流的字符编码成字节。
共性成员方法:
1,void write(int c)
2,void write(char[] cubf)
3,void write(char[] cubf, int off,int len)
4,void write(String str)
5,void write(String str,int off,int len)
6,void flush()
7,void close()
构造方法:
1,OutputStreamWriter(OutputStream out):创建使用默认字符编码(UTF-8)的OutputStreamWriter。
2,OutputStreamWriter(OutputStream out, String charsetName):创建使用指定字符编码OutputStreamWriter。
参数:
OutputStream out:字节输出流;
String charsetName:不区分大小写,可以为utf-8/UTF-8,GBK/gbk…。
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class DemoOutputStreamWriter {
public static void main(String[] args) throws IOException {
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("src\\Month_05\\day5_20\\gbk.txt"),"gbk");
osw.write("你好!我是某某某");
osw.flush();
osw.close();
}
}
三,InputStreamReader
java.io.InputStreamReader extends Reader.
InputStreamReader:是字节流通向字符流的桥梁,它使用指定的charset读取字节并将其解码为字符。
共性成员方法:
1,int read()
2,int read(char[] cubf)
3,int close()
构造方法:
1,InputStreamReader(InputStream in):创建一个使用默认字符集的InputStreamReader;
2,InputStreamReader(InputStreamReader in,String charsetName):创建一个使用指定字符集的InputStreamReader。
参数:
1,InputStream in:字节输入流,用来读取文件中保存的字节;
2,String charsetName:指定编码表名称。
注意:构造方法中指定的编码表名称要和文件的编码相同,否则发生乱码。
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class DemoInputStreamReader {
public static void main(String[] args) throws IOException {
InputStreamReader isr = new InputStreamReader(new FileInputStream("src\\Month_05\\day5_20\\gbk.txt"),"gbk");
int len = 0;
while ((len = isr.read())!=-1){
System.out.print((char)len);//你好
}
isr.close();
}
}