utf-8和Unicode到底有什么區(qū)別?是存儲方式不同?編碼方式不同?它們看起來似乎很相似,但是實(shí)際上他們并不是同一個層次的概念
要想先講清楚他們的區(qū)別,首先應(yīng)該講講Unicode的來由。
- 眾所周知,在盤古開天辟地之前,sorry ,走錯片場了(⊙o⊙)…在計(jì)算機(jī)發(fā)明的時(shí)候 ,由于計(jì)算機(jī)你只能表示二進(jìn)制的數(shù)據(jù),美帝人民為了交流通信方便,約定了一個編碼系統(tǒng),就是ASCII碼,把a(bǔ)bc..xyz...ABC...XYZ...!@#...等字符分別和0,1,2,3,4......對應(yīng),發(fā)現(xiàn)差不多剛好128個數(shù),半個字節(jié)的長度,為了防止以后需要為新的符號編碼,于是干脆取一個字節(jié),最高位置為0。后七位從0-127分別對每一個符號編碼。
- 于是,計(jì)算機(jī)每次讀取一個字節(jié),然后參照ASCII表把這些編碼翻譯成字符。美國人民很高興,拿著自己玩去了.......
-
后來歐洲人也玩計(jì)算機(jī),發(fā)現(xiàn)不行啊,還有很多符號(法語,德語)ASCII沒辦法表示啊,于是歐洲人自己也擼了一套編碼,一個字節(jié)的長度,把最高位也用掉了。這套編碼叫ISO。
- 和ASCII表類似,計(jì)算機(jī)也是每次只讀一個字節(jié),然后按照ISO表,解碼出字符。于是歐洲人民也很高興。
-
中國人不高興了,特么我們漢字有幾萬個,常用的就有幾千個,沒有兩個字節(jié)根本交不了貨。于是勤勞勇敢的中國人民就破天荒的用了兩個字節(jié)來表示中文。整出一套GBK。為了現(xiàn)實(shí)我中華民族兼容并蓄,我們兼容了ASCII編碼。
gbk編碼規(guī)定,計(jì)算機(jī)不能在每次都只讀一個字節(jié)那么死板了,你要先看看第一位是不是為0,要是為0 的話,就當(dāng)作ASCII碼來讀入一個字節(jié),不然的話就讀入兩個字節(jié)。
計(jì)算機(jī) : WTF ?? !!
于是天下就很亂了,歐洲人看不懂我們發(fā)過去的信息,我們也看不懂他們的東西,美國人看不懂我的東西,不過我們能看懂他們的信息。。。哈哈。
總之,天下大亂,群雄并起,百姓生靈涂........
這個時(shí)候,就有個國際組織站出來了,說,這么著吧,我來擼一套編碼,把大家的編碼都?xì)w納進(jìn)來。于是unicode編碼就出現(xiàn)了。這套編碼表的編號從0一直算到了100多萬(三個字節(jié))。每一個區(qū)間都對應(yīng)著一種語言的編碼。目前幾乎收納了全世界大部分的字符。所有的字符都有唯一的編號,這就解決了解碼的沖突,于是天下大定!但是,unicode把大家都?xì)w納進(jìn)來,卻沒有為編碼的二進(jìn)制傳輸和二進(jìn)制解碼做出規(guī)定。只留下一句:大哥只能幫你到這里了。
我知道你一定在想,要個毛的規(guī)定啊,每次讓計(jì)算機(jī)讀取三個字節(jié)然后參照Unicode表解碼就好了。想法是好的,但是如果類似于1號編碼這樣的小數(shù)據(jù)編號也要三個字節(jié)的話,那么也就是0x000001,這簡直就是浪費(fèi)啊,明明一個字節(jié)就可以表示了,你非得整三個,所以你到底是幾個意思呢?
不管怎么樣,大哥雖然走了,但是問題還得解決啊,于是,就出現(xiàn)了如下解決方案:uft-8,utf-16,utf-32這些編碼方案。utf-16是用兩個字節(jié)來編碼所有的字符,utf-32則選擇用4個字節(jié)來編碼。下面只講一下utf-8這種解決方案,因?yàn)樗玫淖疃?,用得最多是因?yàn)樵诋?dāng)時(shí)它的方案最好,最節(jié)省資源。
- utf-8
utf-8為了節(jié)省資源,采用變長編碼,編碼長度從1個字節(jié)到6個字節(jié)不等

- 我知道你想說,明明看起來utf-16更加節(jié)省資源,節(jié)省空間,正常人都看得出來。但實(shí)際上,當(dāng)時(shí),互聯(lián)網(wǎng)上絕大部分存在的資源都是英文的,英文在utf-16中也是2個字節(jié),而在utf-8中則是1個字節(jié)。在當(dāng)時(shí),顯然是utf-8更加節(jié)省資源。現(xiàn)在我們在中文世界里來比較他們,則是utf-16更加節(jié)省資源。
OK,關(guān)于unicode和utf-8的區(qū)別已經(jīng)解釋完畢了。下面用一個圖來鞏固一下那些區(qū)別
