黑马程序员 知识点总结-Java IO(五)字符编码

时间:2023-01-27 12:50:19


----------------------Android培训Java培训、期待与您交流! ----------------------


【字符编码】


      字符流的出现为了方便操作字符。更重要是的加入了编码转换。通过子类转换流来完成。


      InputStreamReaderOutputStreamWriter在两个对象进行构造的时候可以加入字符集。


      转换流的编码应用:


             可以将字符以指定编码格式存储;可以对文本数据指定编码格式来解读


      例:


		// 创建输出转换流对象,与文件相关联,以默认编码表GBK存储数据
		OutputStreamWriter osw = new OutputStreamWriter(
				new FileOutputStream("gbk.txt"));
		// 创建输出转换流对象,与文件相关联,以utf-8编码表存储数据
		OutputStreamWriter osw1 = new OutputStreamWriter(
				new FileOutputStream("utf.txt"), "utf-8");
		// 创建输入转换流对象,与文件相关联,以默认编码表读取数据
		InputStreamReader isr = new InputStreamReader(
				new FileInputStream("gbk.txt"));
		// 创建输入转换流对象,与文件相关联,以utf-8编码表读取数据
		InputStreamReader isr1 = new InputStreamReader(
				new FileInputStream("utf.txt"), "utf-8");

      编码表的由来:


             计算机只能识别二进制数据,为了方便应用计算机,让它可以识别各个国家的文字,


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


      常见的编码表:


  1. ASCII:美国标准信息交换码。用一个字节的7位可以表示

  2. ISO8859-1:拉丁码表,欧洲码表。用一个字节的8位表示

  3. GB2312:中国的中文编码表。用两个字节16位表示

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

  5. Unicode:国际标准码,融合了多种文字。所有文字都用两个字节来表示,Java语言使用的就是unicode

  6. UTF-8:最多用三个字节来表示一个字符。支持中文字符

    字符编码

           编码:字符串à字符数组

                         Stringà getBytes();getBytes(StringCharSet);à byte[]

                         在编码时,可以指定编码集,默认为GBK

           解码:字符数组à字符串

                         Byte[]ànew String();new String(String CharSet);àString

                         在解码时,可以指定编码集,默认为GBK

           例:

                  Strings1 = "你好";

                  Strings2 = "你好";

                  //对字符串进行编码,默认为GBK

                  byte[]b1 = s1.getBytes();

                  //指定编码集为utf-8

                  byte[]b2 = s2.getBytes("utf-8");

                  System.out.println(Arrays.toString(b1));

                  System.out.println(Arrays.toString(b2));

                  //按指定编码集解码

                  s1= new String(b1,"gbk");

                  s2= new String(b2,"utf-8");

                  System.out.println(s1);

                  System.out.println(s2);


      注意:用什么编码集进行编码,必须用什么编码集进行解码,否则会出现乱码;当


              服务器出现乱码时,先用”iso8859-1”编码,然后再用”gbk”进行解码


记事本-联通:


      在记事本中只写入联通两个字,关闭后再打开会出现乱码


      对于utf-8编码表,每个字节都会有标识位:


对于一个字节表示一个字符,字节以0开头


对于两个字节表示一个字符,第一个字符以110开头,第二个字节以10开头


对于三个字节表示一个字符,第一个字符以1110开头,第二个和第三个字节


10开头


             当联通以默认编码表存储到文本文件中时,是以四个字节存储的,这四个字节分别


             1100000110101010 11001101 10101000,当文件用记事本打开时,会读取数据,


             读到第一个字节时,是以110开头,所以会判断第二个字节是否是以10开头,若


             是以10开头,则会用utf-8解码,否则会用默认编码表解码,而第二个字节是以


             10开头,所以记事本会用utf-8解码,所以会出现乱码




----------------------Android培训Java培训、期待与您交流! ----------------------