共计 1600 个字符,预计需要花费 4 分钟才能阅读完成。
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);
}