字符集編碼淺析:Unicode和UTF-8

zhanjindong的部落格發表於2014-11-25

今晚聽同事分享提到這個,簡單總結下。

Unicode字符集

Unicode的出現是因為ASCII等其他編碼碼不夠用了,比如ASCII是英語為母語的人發明的,只要一個位元組8位就能夠表示26個英文字母了,但是當跨區域進行資訊交流的時候,尤其是Internet的出現,除了“A”,“B”,“C”,還有“你”,“我”,“他”需要表示,一個位元組8位顯然不夠用,因此Unicode就被發明出來,Unicode的最大碼位0x10FFFF,有21位。中文對應的Unicode編碼見http://www.chi2ko.com/tool/CJK.htm

UTF-8字元編碼

Unicode只是給這世界上每個字元規定了一個統一的二進位制編號,並沒有規定程式該如何去儲存和解析。

可以說UTF-8是Unicode實現方式之一,它的規則如下: 1)對於單位元組的符號,位元組的第一位設為0,後面7位為這個符號的unicode碼。因此對於英語字母,UTF-8編碼和ASCII碼是相同的。 2)對於n位元組的符號(n>1),第一個位元組的前n位都設為1,第n+1位設為0,後面位元組的前兩位一律設為10。剩下的沒有提及的二進位制位,全部為這個符號的unicode碼。

Unicode編碼(十六進位制) UTF-8 位元組流(二進位制)
000000 – 00007F 0xxxxxxx
000080 – 0007FF 110xxxxx 10xxxxxx
000800 – 00FFFF 1110xxxx 10xxxxxx 10xxxxxx
010000 – 10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

可以看到最多一共有21個x,所以剛好能夠表示Unicode的最大的碼位。

大端(BE)和小端(LE)

考慮4個位元組的16進製表示ox12345678,計算機都是以位元組為單位儲存資料的,因此記憶體地址空間從低到高被挖成一個個“坑”,一個蘿蔔一個坑,那麼相鄰的蘿蔔之間自然就有順序的問題。文字說明太抽象,直接看圖理解。

大端跟我們平時的書寫習慣一致,比較好理解,記住大端就可以了,我們平時說的網路位元組順序也是指大端,至於小端就讓它見鬼去吧。

實在要文字說明理解的話,可以這麼來:大端可以認為是“高位在尾端”(大->高),“高位”指的是我們書寫時的高位,比如1024,個十百千,1是高位,“尾端”指的是記憶體空間中低地址一端,所以1儲存在低地址空間,只不過計算機是以一個位元組為單位的。反之小端就是“低位在尾端”(小->低)了。

BOM

BOM(Byte Order Mark)是用來區分位元組序列和編碼方式的(UTF-8,UTF-16,UTF-32)。就是讓編輯器或程式讀到前面幾個位元組就知道後面該以哪種編碼方式來解析,8/16/32是指以多少位作為編碼單位的,依次就是1/2/4個位元組,因為UTF-8是以單個位元組作為編碼單位的所以其實沒有必要指定它的位元組序列,所以UTF-8有BOM和無BOM的兩種。

UTF編碼 Byte Order Mark (BOM)
UTF-8 without BOM
UTF-8 with BOM EF BB BF
UTF-16LE FF FE
UTF-16BE FE FF
UTF-32LE FF FE 00 00
UTF-32BE 00 00 FE FF

相關文章