UTF-8、UTF-16、Unicode的區別
看了很多網上的總結,我撈出來最乾的部分羅列在這裡,希望對大家有幫助
字符集是指字元的集合,例如所有的英文字母是字符集,所有的漢字也是字符集,全世界所有語言的符號都放在一起,也可以稱為一個字符集,字符集中的字元沒有順序之分,在給字元集合中的每個字元都分配一個整數編號之後,這個字符集就有了順序,成為編碼字符集。同時,根據這個編號可以唯一確定字符集中的某個字元。當然對於同一個字元,不同的編碼字符集所指定的整數編號也不盡相同,例如“兒”字,在Unicode中,它的編號是0x513F(為方便起見以十六進位制表示,但這個整數編號並不要求必須以十六進位制表示),表示它是編碼字符集Unicode中的第0x513F個字元。而在編碼字符集Big5中,它就是第0xA449個字元了。許多字元在不同的編碼字符集中被分配了相同的整數編號,如英文字母“A”在ASCII和Unicode中都是第0x41個字元。需要注意的是,編碼字符集中字元被分配的整數編號,不一定就是該字元在計算機中儲存時所用的值,計算機中儲存的字元到底使用什麼二進位制整數值來表示,是由編碼方式決定的。
一般不用二進位制來表示某個字元的編碼(因為不便於書寫和閱讀),一般採用十六進位制來表示某個字元的編碼。
編碼方式決定了如何將一個字元的整數編碼對應到一個二進位制數,有的編碼方式直接將該整數編碼轉換為二進位制數儲存在計算機中(如英文字元),幾乎所有的編碼方式中,英文字母的整數編碼都與其在計算機記憶體儲的二進位制數一致。但有的編碼方式,例如適用於Unicode字符集的UTF-8編碼形式,就將很大一部分字元的整數編碼作了變換後再儲存在計算機中。以“漢”為例,“漢”的Unicode編碼為6C49,但其UTF-8編碼為E6B189(變成了三個位元組,表示漢”是編碼字符集Unicode中的第6C49個字元,將該整數編號6C49以編碼方式UTF-8編碼為二進位制後得到E6B189)。另一種編碼方式UTF-16對Unicode中的前65536個字元的編碼均不做變換,直接作為計算機儲存時使用的值(對65536以後的字元,仍然要做變換),如“漢”的Unicode編碼為6C49,經過編碼方式UTF-16編碼後儲存在計算機上時,它的編碼仍是6C49。正是因為UTF-16的存在,使得很多人認為Unicode是一種編碼方式(實際上Unicode是一種編碼字符集),也因此很多人說Unicode的時候,實際上指的是UTF-16(再重申一遍,Unicode是編碼方式,UTF-16是字符集,雖然記憶體中兩者的表示方式剛好一樣,但完全不是一種東西)