一文解讀編碼問題(關於ASCII,Unicode,UTF-8,GB2312,GBK,UTF-16)

一文解讀編碼問題

相信很多人經常看到什麼ascii,什麼Unicode,什麼GBK以及GB2312等等

記憶中大一那會計算機老師會告訴你就是一個字母佔一個字節,然後一個漢字佔兩個字節 這種話,其實壓根不是這麼回事!這句話其實非常不嚴謹,如果有的小夥伴用的是Mac或者Linux,你就發現真的不是這麼回事!

字符編碼的前世今生

拉丁文的字母約公元前7世紀~前6世紀時,由希臘字母間接發展而來,成爲古羅馬人的文字,古羅馬滅亡前共包含23個字母,其中有18個輔音字母B、C、D、F、G、Z、H、K、L、M、N、P、Q、R、S、T、X、Y,4個元音字母A、E、I、O,和一個音值不定的V,11世紀時增加了J、U、W,形成了今天的26個字母。

首先計算機的歷史其實並不久遠,只是這個東西出道即巔峯,而且發展非常迅猛,各種技術層不窮!

最初,第一臺計算機“ENIAC” 1946年誕生於在美國賓夕法尼亞大學
顯然,這是老美的作品,在他們的文化中,26個字母就能描繪這個世界,

所以對於計算機而言,所要描繪的字符,最多就大小寫字母加上爲數不多的標點符號,就能完成!

這一切都顯得是那麼的和諧美好吧!

ASCII

所以老美的解決方案就是,ASCII!

小時候媽媽都可能告訴你計算機是二進制表示的,的確,一個字節八位,1<<8即256,所以,對於這些字母而言,存儲只需要一個字節的大小就能解決問題!不能再多了!
在這裏插入圖片描述

但是,計算機的發展可謂迅猛!

在很多西方國家,確實這幾個字母夠表達了,但是對於像我們中華民族幾千年文化,這種象形文字,就不說那些什麼生僻字,還有什麼古文字甲骨文啊之類的,就常用的這些字,少說也有10000+吧,
開什麼國際玩笑,這個數量遠遠超過ascii編碼所能表示的範圍

GB2312

接下來又是一個歷史的時刻,GB2312誕生了,這是中文的一種編碼方案,完整的描述是

在繼承ascii表的基礎上,增加了一些常用的中文編碼,當然關於這個編碼規則可以自行查閱,後來又有了GBK,可以簡單理解爲gb2312是gbk的一個子集,因爲gbk就是多增加了一些文字

這樣中文的表述問題基本得到了解決!

國際化問題

接下來的問題是,中文的顯示沒毛病,但是這不是國際化標準,當你有個朋友在國外留學,你給他發條消息,本來在你電腦上是能正確顯示的,但是發過去他看到的是亂碼或者其他的文字(因爲其他國家也肯定有他們自己文字的一套編碼方案),絕非你想要的表達的意思,這問題很大吧?

你想一下,都2020了,倘若發條消息都成問題,那咋搞?

Unicode誕生

爲了解決這種國際化的語言不通的問題, Unicode誕生了!

什麼是Unicode

Unicode(統一碼、萬國碼、單一碼)是計算機科學領域裏的一項業界標準,包括字符集、編碼方案等。Unicode 是爲了解決傳統的字符編碼方案的侷限而產生的,它爲每種語言中的每個字符設定了統一併且唯一的二進制編碼,以滿足跨語言跨平臺進行文本轉換、處理的要求。1990年開始研發,1994年正式公佈。

“Unicode(統一碼、萬國碼、單一碼)是計算機科學領域裏的一項業界標準”

這是百度百科的描述,強調這是一個標準,統一碼就是全球這麼多國家的文字,都統一編碼了,也就是說每個標點,每個文字,不管你是中文,韓文或者日文在Unicode這套標準中都有唯一的標識,

爲此,就不會出現你發消息過去亂碼的情況了

Unicode只是一個標準

Unicode範圍0x0-0x10FFFF(1114111)
看着這個範圍,似乎明白了什麼,就有的字只需要兩個字節的空間就可存儲在計算機中,但是有的字需要三個字節,爲此,計算機針對Unicode的存儲方案就誕生了!

UTF-8
UTF-16
UTF-32

Unicode存儲實現

不管是UTF-8,UTF-16還是UTF-32,都強調以UTF-後面的數字爲單位,分別是8位即一個字節爲單位,16位兩個字節爲單位,32位4個字節爲單位,

UTF-8因爲是以一個字節爲單位的,因爲是一種變成方案,優點就是節省存儲空間
在這裏插入圖片描述
對於UTF-16就是以兩個字節爲單位,如果Unicode範圍超過兩個字節的字符,就用四個字節存儲

對於UTF-32就更簡單暴力,直接以四個字節存儲,不管你是什麼字符都以四個字節存儲,這種很明顯就是太浪費空間,本來存儲一個字母的只需要一個字節,現在用四個,相當於浪費了三個字節空間!

最後總結

字符編碼其實就是一種映射關係,如果計算機是你發明的,你完全可以將你的名字定義爲0x01,0x02,然而不是,所以通俗地將,就是別人定義的一套映射規則,就像97代表字母’a’一樣,每一個字符都有對應的一個序號,切記Unicode只是一種標準,可以簡單理解爲類與對象的關係,UTF-8也好16也好都只是Unicode的一種實現!

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