GBK和UTF-8編碼的一些探索。

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對英文和數字的編碼是相同的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章