Java 字符集,编码、解码

 

1、

计算机中文件、数据底层都是基于二进制的。

计算机底层并没有文本文件、图片文件之分,它只是记录着每个文件的二进制序列。

 

字符集:包含着字符和二进制序列之间的对应关系,一个字符对应一个二进制序列。

 

编码(Encode):把人能看懂的明文转换为计算机能理解二进制序列。

解码(Decode):把计算机中的二进制序列转换为人能看懂的明文。

 

乱码:解码方式与编码方式不同,即编码、解码使用的字符集不一致。

 

Windows中文本文件的默认字符集是GBK。

 

 

 

 

 

2、

字节的文件输出流可以指定写入模式:

FileOutputStream fos=new FileOutputStream(String/File file);
FileOutputStream fos=new FileOutputStream(String/File file,boolean b);     //第二个参数指定是否是追加模式,true——追加,false——覆盖。


字符的文件流可以指定字符集:

FileWriter fw=new FileWriter(String/File file);
FileReader fr=new FileReader(String/File file);
 //指定字符集
FileWriter fw=new FileWriter(String/File file, String/Charset charset);
FileReader fr=new FileReader(String/File file, String/Charset charset);

//字符的文件输出流还可以指定写入模式
FileWriter fw=new FileWriter(String/File file, boolean b ); //是否是追加模式
FileWriter fw=new FileWriter(String/File file, String/Charset charset, boolean b);

 

2个转换流可以指定编码/解码的字符集:

InputStreamReader isr=new InputStreamReader(InputStream is, String/Charset  charset);   //指定解码字符集
OutputStreamWriter osr=new OutputStreamWriter(OutputStream os, String/Charset charset); //指定编码字符集




 

 

3、NIO中的Charset类

 1   //创建Charset对象,指定编码/解码用的字符集
 2         Charset charset=Charset.forName("GBK");
 3 
 4         //创建编码器
 5         CharsetEncoder encoder=charset.newEncoder();
 6         //使用编码器进行编码。编码是把字符序列转换为字节序列,参数只能是CharBuffer类型,返回值是ByteBuffer类型
 7         ByteBuffer byteBuffer=encoder.encode(CharBuffer charBuffer);
 8         
 9         //创建解码器
10         CharsetDecoder decoder=charset.newDecoder();
11         //使用解码器进行解码。解码是把字节序列转换为字符序列,参数为ByteBuffer类型,返回值是CharBuffer类型
12         CharBuffer charBuffer=decoder.decode(ByteBuffer byteBuffer);

 

也可以不创建编码器、解码器:

1    //创建Charset对象,指定编码/解码用的字符集
2         Charset charset=Charset.forName("GBK");
3 
4         //编码
5         ByteBuffer byteBuffer=charset.encode(String str);  //此处可使用String做参数
6         ByteBuffer byteBuffer=charset.encode(CharBuffer charBuffer);
7         
8         //解码
9         CharBuffer charBuffer=charset.decode(ByteBuffer byteBuffer);

更加简单。

 

 

String类的对象还可以使用以下方法将String(字符序列)编码为byte[](字节序列):

  • byte[]  getBytes()     //使用平台默认的字符集
  • byte[]  getBytes(String/Charset  charset)     //使用指定的字符集

返回编码好的字节序列。

 

posted @ 2019-05-28 13:47  chy_18883701161  阅读(1186)  评论(0编辑  收藏  举报