javaSE-IO补充-编码补充

来源:互联网 发布:aegisub for mac教程 编辑:程序博客网 时间:2024/05/04 03:31

编码表的由来

计算机只能识别二进制数据,早期由来是电信号。
为了方便应用计算机,让它可以识别各个国家的文字。
就将各个国家的文字用数字来表示,并一一对应,形成一张表。
这就是编码表。

常见的编码表

ASCII:美国标准信息交换码。
用一个字节的7位可以表示。
ISO8859-1:拉丁码表。欧洲码表 latin
用一个字节的8位表示。
GB2312:中国的中文编码表。
GBK:中国的中文编码表升级,融合了更多的中文文字符号。
Unicode:国际标准码,融合了多种文字。
所有文字都用两个字节来表示,Java语言使用的就是unicode
UTF-8:最多用三个字节来表示一个字符。
......
/* * 字符串--->字节数组:编码。 * 字节数组--->字符串:解码 * 你好: * GBK:-60 -29 -70 -61  * UTF-8:-28 -67 -96 -27 -91 -67  *  * 原则: * 编码编错了,就不用解码了。 * 编对了,解错了,有可能还有救! */

String str = "你好";//编码:byte[] arr = str.getBytes("gbk");printByte(arr);//解码:String s1 = new String(arr,"ISo8859-1");//ISO8859-1System.out.println("s1="+s1);byte[] arr1 = s1.getBytes("ISO8859-1");printByte(arr1);String s2 = new String(arr1,"GBK");System.out.println("s2="+s2);

但是如下解码无法接析 因为utf-8和GBK编码长度不同
//不太好救!String str = "谢谢";//编码:byte[] arr = str.getBytes("GBK");printByte(arr);//解码:String s1 = new String(arr,"UTF-8");System.out.println("s1="+s1);byte[] arr1 = s1.getBytes("UTF-8");printByte(arr1);//-17 -65 -67 -17 -65 -67 -17 -65 -67 String s2 = new String(arr1,"GBK");System.out.println("s2="+s2);


解码总结 

如果解码过后生成的字符串是???往往是因为GBK编的码 但是用utf-8解的码
如果解码过后生成的字符串是乱码  往往是utf-8编的码 但是使用gbk解的码
因为utf-8中文往往是使用3个字节编码的  gbk是两个
中文不能用ISO-8859-1编码
如果在服务器端解码错误 需要先编码再解码

例如

我们为了实现国际化 服务器端程序总是utf-8的编码 但是服务器 例如  tomcat是iso8859-1的编码 所以肯定乱码   处理办法   先将收到的信息重新编码然后再用utf-8解码

String str=new String(request.getParamenter("name").getBytes("iso8859-1"),"utf-8");


0 0
原创粉丝点击