utf-8和Unicode的糾結

utf-8和Unicode到底有什麼區別?是存儲方式不同?編碼方式不同?它們看起來似乎很相似,但是實際上他們並不是同一個層次的概念

要想先講清楚他們的區別,首先應該講講Unicode的來由。

  • 衆所周知,在盤古開天闢地之前,sorry ,走錯片場了(⊙o⊙)…在計算機發明的時候 ,由於計算機你只能表示二進制的數據,美帝人民爲了交流通信方便,約定了一個編碼系統,就是ASCII碼,把abc..xyz…ABC…XYZ…!@#…等字符分別和0,1,2,3,4……對應,發現差不多剛好128個數,半個字節的長度,爲了防止以後需要爲新的符號編碼,於是乾脆取一個字節,最高位置爲0。後七位從0-127分別對每一個符號編碼。
    於是,計算機每次讀取一個字節,然後參照ASCII表把這些編碼翻譯成字符。美國人民很高興,拿着自己玩去了…….

  • 後來歐洲人也玩計算機,發現不行啊,還有很多符號(法語,德語)ASCII沒辦法表示啊,於是歐洲人自己也擼了一套編碼,一個字節的長度,把最高位也用掉了。這套編碼叫ISO。
    和ASCII表類似,計算機也是每次只讀一個字節,然後按照ISO表,解碼出字符。於是歐洲人民也很高興。

  • 中國人不高興了,特麼我們漢字有幾萬個,常用的就有幾千個,沒有兩個字節根本交不了貨。於是勤勞勇敢的中國人民就破天荒的用了兩個字節來表示中文。整出一套GBK。爲了現實我中華民族兼容幷蓄,我們兼容了ASCII編碼。

gbk編碼規定,計算機不能在每次都只讀一個字節那麼死板了,你要先看看第一位是不是爲0,要是爲0 的話,就當作ASCII碼來讀入一個字節,不然的話就讀入兩個字節。
計算機 : WTF ?? !!

於是天下就很亂了,歐洲人看不懂我們發過去的信息,我們也看不懂他們的東西,美國人看不懂我的東西,不過我們能看懂他們的信息。。。哈哈。

總之,天下大亂,羣雄並起,百姓生靈塗……..

這個時候,就有個國際組織站出來了,說,這麼着吧,我來擼一套編碼,把大家的編碼都歸納進來。於是unicode編碼就出現了。這套編碼表的編號從0一直算到了100多萬(三個字節)。每一個區間都對應着一種語言的編碼。目前幾乎收納了全世界大部分的字符。所有的字符都有唯一的編號,這就解決了解碼的衝突,於是天下大定!但是,unicode把大家都歸納進來,卻沒有爲編碼的二進制傳輸和二進制解碼做出規定。只留下一句:大哥只能幫你到這裏了。

我知道你一定在想,要個毛的規定啊,每次讓計算機讀取三個字節然後參照Unicode表解碼就好了。想法是好的,但是如果類似於1號編碼這樣的小數據編號也要三個字節的話,那麼也就是0x000001,這簡直就是浪費啊,明明一個字節就可以表示了,你非得整三個,所以你到底是幾個意思呢?

不管怎麼樣,大哥雖然走了,但是問題還得解決啊,於是,就出現瞭如下解決方案:uft-8,utf-16,utf-32這些編碼方案。utf-16是用兩個字節來編碼所有的字符,utf-32則選擇用4個字節來編碼。下面只講一下utf-8這種解決方案,因爲它用的最多,用得最多是因爲在當時它的方案最好,最節省資源。

  • utf-8
    utf-8爲了節省資源,採用變長編碼,編碼長度從1個字節到6個字節不等

這裏寫圖片描述

  • 我知道你想說,明明看起來utf-16更加節省資源,節省空間,正常人都看得出來。但實際上,當時,互聯網上絕大部分存在的資源都是英文的,英文在utf-16中也是2個字節,而在utf-8中則是1個字節。在當時,顯然是utf-8更加節省資源。現在我們在中文世界裏來比較他們,則是utf-16更加節省資源。

OK,關於unicode和utf-8的區別已經解釋完畢了。下面用一個圖來鞏固一下那些區別

這裏寫圖片描述

簡書上看到這篇文章,覺得說的很風趣,分享一下。
http://www.jianshu.com/p/36d20de2a1ee

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