编码表的由来
计算机只能识别二进制数据,早期由来是电信号。
为了方便应用计算机,让它可以识别各个国家的文字。
就将各个国家的文字用数字来表示,并一一对应,形成一张表。
这就是编码表。
为了方便应用计算机,让它可以识别各个国家的文字。
就将各个国家的文字用数字来表示,并一一对应,形成一张表。
这就是编码表。
常见的编码表
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-1
System.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");