Java的编码与解码

2017, Jul 04    

Java编码与解码

1.基础知识

(1)GBK编码:支持中文,中文每个字符占2字节,英文每个字符占1个字节
(2)UTF-8编码:支持中文,中文每个字符占3字节,英文每个字符占1字节
(3)ISO-8859-1编码:不支持中文,英文每个字符占1字节。

2.Java编程中的编码与解码

Java中的getBytes()函数如果不指定编码方式,我们的windows系统上一般默认是GBK编码方式。
注意:用什么方式编码,就要用什么方式解码。

编码与解码的实例分析

案例一:

String s = "好";
byte [] UTF8bytes =  s.getBytes("UTF-8");
byte [] GBKbytes = s.getBytes("GBK");
byte [] ISObytes = s.getBytes("ISO-8859-1");
// 下图是对每一个字节数组进行循环输出


案例二:

String s = "好ab";
byte [] UTF8bytes =  s.getBytes("UTF-8");
byte [] GBKbytes = s.getBytes("GBK");
byte [] ISObytes = s.getBytes("ISO-8859-1");
byte [] defaultbytes = s.getBytes();
// 下图是对每一个字节数组进行循环输出


案例三:

String  renewS1 = new String(UTF8bytes,"UTF-8");
String  renewS2 = new String(GBKbytes,"GBK");
// 下图是对这两个字符串打印输出


案例四:

String s = "好";
byte [] UTF8bytes =  s.getBytes("UTF-8");
byte [] GBKbytes = s.getBytes("GBK");
byte [] ISObytes = s.getBytes("ISO-8859-1");
byte [] defaultbytes = s.getBytes();

String isoS = new String(UTF8bytes,"ISO-8859-1");
byte [] isobytes = isoS.getBytes("ISO-8859-1");

String gbkS = new String(UTF8bytes,"GBK");
byte [] gbkbytes = gbkS.getBytes("GBK");

String reNewUTFSByIso = 
new String(isoS.getBytes("ISO-8859-1"), "UTF-8");
String reNewUTFSByGbk = new String(gbkS.getBytes("GBK"), "UTF-8");

总结

(1)一个字符串采用同一种编码方式进行编码,然后解码是不会乱码的。
(2)一个字符串首先采用A方式编码成字节数组,其次采用B方式解码为字符串,然后采用B方式编码为字节数组,最后采用A方式解码为字符串。最终是否会乱码,主要看第三步的字节数组与第一步的字节数组相同与否。
(3)UTF-8中文占三字节,GBK中文占二字节。ISO-8859-1英文站一字节。由于UTF-8和GBK的字节数都是ISO-8859-1字节数的倍数。所以一个字符串用UTF-8编码后是可以用ISO-8859-1解码的,GBK也是如此。
(4)字符串用UTF-8编码后,用GBK解码。如果这个字符串的UTF-8编码后的字节数组与GBK不能满足字节间的倍数关系,就会乱码。