组团学

转换流的出现

阅读 (1232414)

1、转换流(字符流)出现的原因及思想

由于字节流操作中文不是特别方便,所以,java就提供了转换流。
字符流=字节流+编码表

字节流读取中文可能出现的小问题

public static void main(String[] args) throws IOException { // 创建字节输入流对象 FileInputStream fis = new FileInputStream("a.txt"); // 读取数据 (这种情况读出数据存在编码出错的可能性,因为有的符号不是一个字节一个编码) // int by = 0; // while ((by = fis.read()) != -1) { // System.out.print((char) by); // } byte[] bys = new byte[1024]; int len = 0; while ((len = fis.read(bys)) != -1) { System.out.print(new String(bys, 0, len)); } // 释放资源 fis.close(); }

2、编码表概述和常见的编码表

编码表
由字符及其对应的数值组成的一张表

计算机只能识别二进制数据,早期由来是电信号。

为了方便应用计算机,让它可以识别各个国家的文字。

就将各个国家的文字用数字来表示,并一一对应,形成一张表。

编码:把看得懂的变成看不懂的
String – byte[]

解码:把看不懂的变成看得懂的
byte[] – String

举例:谍战片(发电报,接电报)

码表:小本子
字符 数值

要发送一段文字
今天晚上在老地方见

​ 发送端:今 – 数值 – 二进制 – 发出去
​ 接收端:接收 – 二进制 – 十进制 – 数值 – 字符 – 今

常见编码表
ASCII/Unicode 字符集
ISO-8859-1
GB2312/GBK/GB18030
BIG5
UTF-8

常见编码表解释

ASCII:美国标准信息交换码。

用一个字节的7位可以表示。

ISO8859-1:拉丁码表。欧洲码表

用一个字节的8位表示。

GB2312:中国的中文编码表。

GBK:中国的中文编码表升级,融合了更多的中文文字符号。

GB18030:GBK的取代版本

BIG-5码 :通行于台湾、香港地区的一个繁体字编码方案,俗称“大五码”。

Unicode:国际标准码,融合了多种文字。

所有文字都用两个字节来表示,Java语言使用的就是unicode

UTF-8:最多用三个字节来表示一个字符。

UTF-8不同,它定义了一种“区间规则”,这种规则可以和ASCII编码保持最大程度的兼容:

它将Unicode编码为00000000-0000007F的字符,用单个字节来表示
它将Unicode编码为00000080-000007FF的字符用两个字节表示
它将Unicode编码为00000800-0000FFFF的字符用3字节表示

3、字符串中的编码问题

编码
把看得懂的变成看不懂的
解码
把看不懂的变成看得懂的

public static void main(String[] args) throws UnsupportedEncodingException { String s = "你好"; // String -- byte[] //编码 byte[] bys = s.getBytes(); // [-60, -29, -70, -61] // byte[] bys = s.getBytes("GBK");// [-60, -29, -70, -61] // byte[] bys = s.getBytes("UTF-8");// [-28, -67, -96, -27, -91, -67] System.out.println(Arrays.toString(bys)); //解码 // byte[] -- String String ss = new String(bys); // 你好 // String ss = new String(bys, "GBK"); // 你好 // String ss = new String(bys, "UTF-8"); // ??? System.out.println(ss); }
需要 登录 才可以提问哦