這世界上大概有100萬個字符,平均每一個人一輩子接觸的字符數在6k左右,那麼問題來了,如何讓計算機來存下全部的字符。bash
計算機誕生於美國,起初用的是真空管的電位高低來表示0和1,8個真空管爲一組,由此組成了計算機內的單位——Byte字節,大小爲8個bit。網絡
美國人一輩子只須要識別26個字母就夠了。因而,他們用半個字節就足以表示本身所能識別的字符。這就是ASCII字符集,範圍爲0-127.編碼
其中,0x20如下爲控制字符,不可顯示。好比,0x10表示換行,0x07表示發聲。另外還有個特殊的控制字符,0x7f表示刪除。spa
0x30表示數字0;0x41表示字母A;0x61表示字母a。code
這個字符集佔的空間小,又足以知足平常需求,美國人很滿意。cdn
歐洲國家進口計算機後,也有了在計算機上顯示本身的經常使用字符的要求,因而乎,就想着對ASCII進行擴展。blog
你美國人不是才用了半個字節嗎,那好,剩下的半個字節由咱們來定義。數學
因而乎,0x80 - 0xff的定義就被填充成了希臘字母,羅馬字母等符號。it
此時,編碼依舊控制在8位之內,相安無事。io
古老的中國,終於也開始接觸計算機。它博大精深的文化,怕是ASCII編碼的制定者所始料未及的。
美國人想到中國的鍵盤,怎麼着至少也得兩千多個鍵吧。
呵呵,區區一個字節,256個坑位,怎麼填的下我博大精深數千漢字字符呢。因而,強大的天朝發佈了本身的字符編碼標準——GB2312.
思想很簡單,若是一個字符值爲127及如下,那它就是一個單字節字符,和ASCII兼容; 若是一個字符值爲127以上,那它和後面的那個字符組成一個漢字。(同時,後面那個字符也必定是127以上的)
經過這個方式,咱們擴展出來了7000+的簡體漢字,同時還把日本假名,羅馬希臘字母,數學符號也容納了進來。
同時還產生了一個新的概念,全角字符:ASCII碼裏自己有的字符,也被咱們擴展成了雙字節字符。爲了區分,前者稱爲半角字符,後者稱爲全角字符。
至此,中文也能夠在計算機上表示了。
仍是一箇中華文化博大精深的問題,7000個簡體漢字並不能把漢字窮舉了,一些生僻字並不包含在GB2312裏。
GB2312表示,我可能還能夠搶救一下,我還有另外一半的潛力沒有發揮呢!
這另外一半的潛力就是,第二個字節的0x00 - 0x7f部分。這部分空出來,是因爲GB2312表示漢字時,要求兩個字節都是在0x80 - 0xff範圍內的。
填上這部分的空檔以後,再生僻的字也被表示出來了,同時,咱們還考慮到港澳臺同胞的感覺,包含了繁體字,一共大概增長了20k的漢字和符號。
從今之後,不再許有人跟我說在計算機裏有打不出來的漢字~
然而,咱們作出來的GBK,並不被對岸認可。由於對岸並無和咱們共建這個標準。 隨着時間的推移,互聯網的興起,不止海峽兩岸,全世界範圍內共建一個字符集的呼聲愈來愈高。
這個標準,只能有一個機構能夠作,那就是ISO(我對這個組織的印象是它曾經弄出來了一個教科書級別的網絡七層模型,也僅限於教科書使用)。 ISO做爲一個相似《聖經》中創世紀的角色,因而說了一句「要有Unicode字符集」。 因而,就有了Unicode字符集。
Unicode,統一了全部地區的字符,且還在不斷擴充中。全部地區的字符,都被用兩個字節來表示。與前面提到的GBK等不一樣的是,Unicode並不兼容ASCII。它要求ASCII字符在高8位補0,強行把ASCII碼用兩個字節來表示。
到這裏,世界在Unicode的驅動下,彷佛要趨於大同了。
叮咚~ISO的門鈴響了,是美國人啦~
回到ASCII的創始那一段,美國人用的最多的,仍是26個字母,一個字節能夠表示完的字符集,非要用我用兩個字節來表示,我山姆大叔今天就是要逆你Unicode的天。你知不知道你讓個人網絡流量和硬盤存儲空間都翻倍啦?
加上一些只認ASCII碼的老系統,根本就沒法在Unicode環境工做了。
這個時候,就須要一個折中的方案出來了。既兼容ASCII,不形成空間浪費,又能像Unicode那樣,囊括四海以內的字符。
這個時候,UTF-8編碼被提出來了。
前面說的都是字符集,UTF-8倒是一種編碼方式,由於它並非去作字符集的事情,而是爲的便於Unicode碼的傳輸和存儲而生的。
與其餘的編碼方式(如哈夫曼編碼)的思想一致,UTF-8的原則就是,使用不定長字節(1-6字節)來表達一個字符,使用頻率越高的字符,字節數越少。這樣就能最大程度上節約空間。具體的編碼方式以下:
單字節字符:
以0開頭,後面7位表示字符,事實上,UTF-8的單字節字符就是ASCII字符,完美兼容;
n字節字符:
第一個字節的前n位爲1,第n+1位爲0。讀到此字節時,能夠方便的知道後續多少字節是用來表示一個字符;
其他字節,以10開頭。
複製代碼
Unicode符號範圍 | UTF-8編碼方式
(十六進制) | (二進制)
—————————————————————–
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
複製代碼
UTF-8和Unicode是一一對應的,對於經常使用漢字,基本上都是佔用3個字節,生僻漢字可能佔用到6個字節。對於GB2312和GBK來說,UTF-8無疑形成了浪費,因此,UTF-8能夠說是對英文友好,但對中文不友好的一種編碼方式。因此在中文界,GB2312與GBK依舊有本身的市場。
簡單來講: 美國人爲了表示平常用的字符,制定了ASCII。用一個字節來表達字符; 歐洲人爲了表示平常用的字符,擴充了ASCII。加入ASCII擴展字符;用一個字節來表達字符; 中國人爲了表示經常使用簡體漢字,制定了GB2312。用兩個字節來表達字符; 中國人爲了表示生僻漢字和繁體字,擴充GB2312爲GBK。用兩個字節來表達字符; ISO爲了統一全世界的字符,制定了Unicode。用兩個字節來表達字符; 爲的便於Unicode的傳輸和存儲,UTF-8編碼方式被制定出來。使用1-6個不定字節來表達字符。