----------------------Android培训、Java培训、期待与您交流! ----------------------
【字符编码】
字符流的出现为了方便操作字符。更重要是的加入了编码转换。通过子类转换流来完成。
InputStreamReader和OutputStreamWriter在两个对象进行构造的时候可以加入字符集。
转换流的编码应用:
可以将字符以指定编码格式存储;可以对文本数据指定编码格式来解读
例:
// 创建输出转换流对象,与文件相关联,以默认编码表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");
编码表的由来:
计算机只能识别二进制数据,为了方便应用计算机,让它可以识别各个国家的文字,
就将各个国家的文字用数字来表示,并一一对应,形成一张表,就是编码表。
常见的编码表:
-
ASCII:美国标准信息交换码。用一个字节的7位可以表示
-
ISO8859-1:拉丁码表,欧洲码表。用一个字节的8位表示
-
GB2312:中国的中文编码表。用两个字节16位表示
-
GBK:中国的中文编码表升级,融合了更多的中文文字符号
-
Unicode:国际标准码,融合了多种文字。所有文字都用两个字节来表示,Java语言使用的就是unicode
-
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培训、期待与您交流! ----------------------