转换流的出现

2022-09-14 20:11:36 浏览数 (1)

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);
	}

0 人点赞