JAVA字节流、字符流、缓冲流、转换流、内存流、字符编码( 七 )


为了解决各个国家因为本地化字符编码带来的影响 , 把全世界所有的符号统一进行编码-Unicode编码;此时某一个字符在全世界任何地方都是固定的 , 比如字符:'哥' , 在任何地方都是以十六进制的54E5来表示 。Unicode的每个编码字符都占有2个字节大小 。
 
常见的字符集:

  • ASCII:每个字符占一个字节 , 只能包含128个符号 , 不能表示汉字;
  • ISO-8859-1:每个字符占一个字节 , 收录西欧语言 , 不能表示汉字;
  • ANSI:每个字符占两个字节 , 在简体中文的操作系统中 , ANSI 就指的是 GB2312;
  • GB2312/GBK/GB18030:每个字符占两个字节 , 中文专用编码;
  • UTF-8:是一种针对Unicode的可变长度字符编码 , 又称万国码 , 是Unicode的实现方式之一 , 目前的应用率最高;
  • UTF-8 BOM:是微软搞出来的编码 , 默认占3个字节 , 使用率并不高;
编码中的第一个字节仍与ASCII兼容 , 这使得原来处理ASCII字符的软件无须或只须做少部份修改 , 即可继续使用 。因此 , 它逐渐成为电子邮件、网页及其他存储或传送文字的应用中 , 优先采用的编码 。
互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码 。
 
存储字母 , 数字和汉字
存储字母和数字时无论是什么字符集都只占1个字节(因为和ASCII兼容) , 但是存储汉字:GBK家族占两个字节 , UTF-8家族占3个字节 。
存储中文时 , GBK和UTF-8都是OK的 。
import java.util.Arrays;/** * 字符编码 */public class EncodingDemo {public static void main(String[] args) throws Exception {String str = "老夫不正经";// 以特定编码格式编码字符串byte[] data = https://www.isolves.com/it/cxkf/yy/JAVA/2020-05-03/str.getBytes("UTF-8");System.out.println(Arrays.toString(data));// 解码字符串str = new String(data, "ISO-8859-1");System.out.println(str);// 此时 , 字符串str是乱码:???laquo;??ccedil;?// 解决方案便是 , 使用ISO-8859-1来读取字节数据 , 然后使用UTF-8重新编码data = str.getBytes("ISO-8859-1");System.out.println(Arrays.toString(data));str = new String(data, "UTF-8");System.out.println(str);}} 
小结
  1. InputStream 和 OutputStream
  2. Reader 和 Writer
  3. 文件过滤器
  4. 字节流
  5. 字符流
  6. 缓冲区
  7. 资源关闭
  8. 缓冲流
  9. 转换流
  10. 内存流
  11. 合并流
  12. 字符编码
完结 , 老夫虽不正经 , 但老夫一身的才华 。

【JAVA字节流、字符流、缓冲流、转换流、内存流、字符编码】


推荐阅读