字符编码
一、概述
InputStreamReader
OutputStreamWriter
字符转换流是字符流与字节流转换的桥梁,同时加入了编码转换。
二、编码表的由来
计算机只能识别二进制数据,早期由来是电信号;
为了方便应用计算机,识别各个国家的文字;
就将各个国家的文字用数字来表示,并一一对应,形成一张表,这就是编码表。
三、常见的编码表
注意:
1、Java语言char类型使用的是Unicode
2、UTF-8每一个字节的开头都加有标识头,加完后很容易区分。UTF-8中汉字用3个字节表示。
3、中文码表兼容ASCII码表(中文中有拼音)。
四、转换流的编码应用
1、可以将字符以指定编码格式存储。
2、可以对文本数据指定编码格式来解决。
3、指定编码的动作由构造函数完成,构造方法如下:
InputStreamReader(InputStream in, String charsetName)
创建使用指定字符集的 InputStreamReader
OutputStreamWriter(OutputStream out, String charsetName)
创建使用指定字符集的 OutputStreamWriter
五、编码与解码
1、定义
编码:String→byte[] —-> byte[] getBytes(Charset)
解码: byte[]→String—->String(byte[],charsetName)
String(byte[], int offset, int length,charsetName)
2.图解
注意:
1)如果编码编错了,就无法再解码了。
2)之所以可以再解码是因为ISO8859-1不识别中文,解码的时候保持了数据的原样性。如果开始使用UTF-8解码,由于UTF-8支持中文,解码之后数据就发生了变化,不再是原有数据。
3)Tomcat服务器默认编码就是ISO8859-1,当Tomcat服务器出现乱码时,可以再解码还原数据。
4)用记事本打开文件是解码,因为电脑中的数据都是二进制文件。
3.“联通”现象:在记事本中存入联通,再次打开出现乱码
现象解释:
UTF-8有自己的标识头,如下:
联通的二进制数:
**110**00001
**10**101010
11001101
10101000
刚好“联通”的二进制代码刚好满足UTF-8的标示,再次打开记事本时,其就按UTF-8解码所以造成乱码。