1. 程式人生 > >utf-8和Unicode的區別

utf-8和Unicode的區別

shu 中國人 gbk sci 都對 編碼方式 過去的 view 關系

鏈接

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

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

技術分享
Unicode與uft-8的結構關系.png


作者:拉丁吳
鏈接:http://www.jianshu.com/p/36d20de2a1ee
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。

utf-8和Unicode的區別