1、转换流(字符流)出现的原因及思想
由于字节流操作中文不是特别方便,所以,java就提供了转换流。 字符流=字节流 编码表
字节流读取中文可能出现的小问题
代码语言:javascript复制 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、字符串中的编码问题
编码 把看得懂的变成看不懂的 解码 把看不懂的变成看得懂的
代码语言:javascript复制 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);
}