快速徹底理解字符集和字符集編碼的區別

很多文章搞長篇大論大講特講人類爲了讓計算機能夠準確表示各種字符的演化歷史,這完全是沒有必要的,幾句話就能說明白。

"字符集"和"字符集編碼"是兩回事

字符集(Charset Set),僅僅是一套從【字符】到【數字】的映射字典,它只規定了應該用什麼數字來標識字符,僅此而已,至於計算機在存儲的時候應該用什麼字節來標識,字符集是根本不管這事的。Unicode, GB2312, ASCII都屬於字符集。

字符集編碼(Character Encoding),專門規定了字符集中的字符在計算機中應該如何存儲,說白了就是怎麼用字節來表示他們。UTF8, UTF16, 都屬於字符集編碼。

大家感受到區別了麼,如果把字符集比作立了一套法律,那麼字符集編碼就是法律的執行方式。隻立法而不去執行則立法毫無意義,字符集也是如此。只有字符集而沒有規定如何編碼,那對於計算機來說也毫無用處。因爲在計算機看來,世間萬物都是字節,而只有將人類規定的字符集【編碼】成字節,計算機才能識別和存儲。

有人既是字符集,又是字符集編碼

注意這裏有一個地方非常容易混淆,那就是有的人【既是字符集,又是字符集編碼】。比如GB2312作爲字符集的時候,規定了“你”這個漢字用十六進制的0xC4E3來表示,同時GB2312又是編碼規範,因此在計算機中,可以直接使用0xC4E3來存儲“你”。ASNII也是同理,都屬於字符集跟其編碼完全一致的玩意。

而Unicode就不一樣了,想要存儲Unicode中規定的字符,就必須使用另一種編碼方式對其進行編碼,比如UTF8就是一種使用1~3個字節來表示的一種編碼方式。

Java

在Java語言裏,它使用的是Unicode字符集,和UTF16的編碼。也就是說Java能表示出全部Unicode字符集中規定了的字符,然後在內存中存儲時,通過UTF16中定義的規則,將其轉換成字節。例如“a”這個字母,在Unicode中規定要用十六進制下的0x61來表示,但是實際存儲的時候可不是直接存的0x61,而是查UTF16表,發現應該是0x0061。所以,Java中一個char類型在內存中佔用兩個字節,因爲他們存儲的是UTF16編碼後的字符,而UTF16則是把所有Unicode字符都使用固定了兩字節的方式進行編碼。

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