什麼是字符集編碼?字節和不同的編碼方式又有什麼關係呢?

 

博主的理解:

首先要明白: 8 bit = 1 byte  即八個(位)等於一個(字節),一個位就是一個0或一個1。好多好多的(位)10100101001001010101010101001010100100010組合在一起就成了字節流。這玩意我們看不懂,我們只能看懂字符啊,於是就有了編碼方式,就是我們常說的utf-8、ISO8859-1、GBK等,它們只是一種對應關係,比如按ISO8859-1編碼方式,10000111對應的字符是“H”,那麼我們可以按照ISO8859-1將10000111解碼成字符“H”,也可以將字符“H”編碼成10000111。

字符是我們大家可以理解的一種符號,比如英語字母“a”、漢字“腎”等,當然單詞“apple”、成語“額滴腎啊”也是字符啦,而通過不同的編碼方式,對這些字符串進行編碼形成的01字節流,長度也可能是不同的,比如按照utf-8的話,一個字符“大”就佔3個字節(100101111001011110010111),但對於GBK來說,它只佔了兩個字節(1001011110100011),在這個編碼的過程中,是可能會出現亂碼的,比如ISO8859-1的編碼方式裏沒有漢字的對應方式,它只能識別英文字母以及一些符號(人家就八位嘛,最多也不過只能有二的八次方=256種可能的組合而已,怎麼來能用來代表幾萬種漢字呢)所以用ISO8859-1來對漢字進行編碼的話就會產生亂碼。解碼的過程,就是把字節流解碼爲我們可以理解的字符,比如按照ISO8859-1將10000111解碼爲“H”,這個解碼過程自然也會可能出現亂碼,如果我們改用GBK編碼方式去對10000111進行解碼的話,解出來的字符就肯定不會是“H”了,而是我們看不懂的亂碼。

還有一個有趣的現象,那就是對單詞“apple”進行編碼的時候,用GBK和用ISO8859-1是一樣的結果,這不是巧合,而是我們在制定GBK時便規定如此,在GBK中,英文字母及一些特殊字符對應的字節流和ISO8859-1標準是一致的,也就是說英文字母在GBK中也佔1個字節,這在一定程度上降低了亂碼的概率:

        String str = "apple";
        System.out.println(Arrays.toString(str.getBytes("ISO8859-1")));
        System.out.println(Arrays.toString(str.getBytes("GBK")));

輸出:

[97, 112, 112, 108, 101]
[97, 112, 112, 108, 101]

所以下列代碼最後輸出還是“apple”,原因就很容易理解了:

        String str = "apple";
        //將字符傳str按照GBK的方式編碼成01字節流,再調用String的構造方法將該字節流以ISO8859-1方式解碼成一個新的字符串。
        String n = new String(str.getBytes("GBK"), "ISO8859-1");
        System.out.println(n);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章