package cn.dzr.teststring;
import java.io.UnsupportedEncodingException;
public class Test2
{
public static void main(String[] args) throws UnsupportedEncodingException
{
String str ="我是中国人";
byte[] buff = str.getBytes("utf-8");
//buff为 我是中国人的 utf-8 的编码。
P(buff);
byte[] buf2 = str.getBytes("GBK");
P(buf2);
String str2= new String(buff,"utf-8");
//str2为buff通过utf-8 译码出来的字符串.
System.out.println(str2);
String str3= new String(buff,"GBK");
//str3为 utf-8进行编码的buff 以"GBK“进行解码的结果...
System.out.println(str3);
byte[] buff2 = str3.getBytes("GBK");
//buff2为str3 以GBK进行编码的结果。按理说,应该就和buff是相同的。
P(buff2);
String str4 = new String(buff2,"utf-8");
System.out.println(str4);
}
static void P(byte[] buff)
{
int len = buff.length;
for(int i = 0;i<len ; i++)
{
System.out.print(buff[i]+" ");
}
System.out.println();
}
}
输出结果..
-26 -120 -111 -26 -104 -81 -28 -72 -83 -27 -101 -67 -28 -70 -70
-50 -46 -54 -57 -42 -48 -71 -6 -56 -53
我是中国人
鎴戞槸涓浗浜?
-26 -120 -111 -26 -104 -81 -28 -72 -83 -27 -101 -67 -28 -70 63
我是中国??
可以发现,通过GBK 和UTF-8编码之后,输出的字节数组有明显的不同。
而前面,我是中国人 这五个汉字在进行编码的时候
。utf-8 转换成了15个字节。
而GBK之转换成了10个字节。
也就是说,utf-8将一个汉字解码为3个字节。而GBK则解码为2个字节。
在这里,由于单数个汉字,在转为UTF-8的时候,会变成单数个字节。而再通过GKB进行解码最后一个单位的字节,将会解析成8个字。
最后的一个?号,是GBK在解析最后的一个字节自动补上的。
所以,当我们再次将这段GBK码通过GBK编码时,得出的结果与前面已经不同。
如上面的情况, 最后一位的 -70变成了 63.
如果是偶数个汉字呢。我们做一下测试。
将str 改成“我是中国”。则输出结果如下所示:
-26 -120 -111 -26 -104 -81 -28 -72 -83 -27 -101 -67
-50 -46 -54 -57 -42 -48 -71 -6
我是中国
鎴戞槸涓浗
-26 -120 -111 -26 -104 -81 -28 -72 -83 -27 -101 -67
我是中国
这样,通过再次编码,能够得到正确的结果。
我们再次对英文和数字进行测试。。
String str ="abcdef121231";
最后的输出结果为:
97 98 99 100 101 102 49 50 49 50 51 49
97 98 99 100 101 102 49 50 49 50 51 49
abcdef121231
abcdef121231
97 98 99 100 101 102 49 50 49 50 51 49
abcdef121231
可见,GBK和utf-8对英文和数字的编码是相同的。