字符編碼筆記:ASCII,Unicode 和 UTF-8 的區(qū)別

什么是字符集?

計(jì)算機(jī)發(fā)明出來(lái)后,科學(xué)家們遇到了一個(gè)問(wèn)題,他們不知道該怎么將現(xiàn)實(shí)生活中的符號(hào)存儲(chǔ)進(jìn)計(jì)算機(jī)中。后來(lái),他們想出了構(gòu)建一個(gè)字符集的方法,也就是給每一個(gè)符號(hào)都匹配一個(gè)二進(jìn)制數(shù)。

這樣存儲(chǔ)字符時(shí),就可以通過(guò)查閱字符集得到對(duì)應(yīng)的二進(jìn)制碼,將其存儲(chǔ)在存儲(chǔ)設(shè)備中。讀取數(shù)據(jù)時(shí),同樣是查閱字符集得到二進(jìn)制碼對(duì)應(yīng)的符號(hào),然后將符號(hào)輸出。這樣一個(gè)字符集完美構(gòu)建了字符和二進(jìn)制之間的關(guān)系。

有圖有真相,展示下最常見的 ASCII 碼表吧。

這里寫圖片描述

ASCII 碼

這是美國(guó)人制定的一個(gè)只支持英文字母還有少許特殊字符的一個(gè)字符集。一共有 128 個(gè)字符,上圖已經(jīng)展示了對(duì)應(yīng)關(guān)系了。

ASCII 表中,每個(gè)字符只占一個(gè)字節(jié),且字節(jié)的第一位固定位 0 ,因?yàn)?7 位就能夠表示 128 個(gè)字符。如字母 A 對(duì)應(yīng)的二進(jìn)制形式是 01000001 。

非 ASCII 碼

對(duì)于非英語(yǔ)的國(guó)家,128 個(gè)字符無(wú)法表示他們的語(yǔ)言,這時(shí)候開始把前面閑置的一位也給用上了,倒是能解決一些問(wèn)題。但還是不夠用,比如中文遠(yuǎn)遠(yuǎn)不止 256 個(gè)字符,這時(shí)候就要尋求更高端的字符集了。

然后各個(gè)語(yǔ)言都給自己配置了一套字符集,但這些字符集互相都不兼容,你不認(rèn)識(shí)我,我不認(rèn)識(shí)你。還是拿中文舉例,早先出現(xiàn)了 GB2312 碼,它在兼容了 ASCII 碼的情況下,加入了六千多個(gè)漢字,可是中文哪里只有這么點(diǎn)漢子呢?后來(lái)又出現(xiàn)了兼容 GB2312 的 GBK 編碼。所以,以后遇到 GB2312 和 GBK 碼就不用再迷糊了。

這時(shí)候 ISO 則發(fā)布了一款包含所有語(yǔ)言字符的一個(gè)字符集 unicode 。

Unicode 字符集

它給每一個(gè)字符都規(guī)定了對(duì)應(yīng)的二進(jìn)制數(shù),但是很多字符的二進(jìn)制碼位數(shù)是不同的,比如,漢字"嚴(yán)"的 unicode 是十六進(jìn)制數(shù) 4E25 ,這需要兩個(gè)字節(jié),而如字母 A 對(duì)應(yīng)的二進(jìn)制形式是 01000001 ,這只需要一個(gè)字節(jié)。

unicode 存在嚴(yán)重的兩個(gè)問(wèn)題。第一,如果統(tǒng)一字符存儲(chǔ)的長(zhǎng)度,勢(shì)必會(huì)造成很大的存儲(chǔ)資源浪費(fèi)。第二,在解碼時(shí),怎么判斷是一個(gè)字節(jié)表示一個(gè)符號(hào),還是兩個(gè)字節(jié),甚至更多字節(jié)呢?

基于這樣的問(wèn)題,所以 unicode 碼只給出了每個(gè)字符對(duì)應(yīng)的二進(jìn)制碼,并沒有規(guī)定應(yīng)該用多少個(gè)字節(jié)去存儲(chǔ)它。相當(dāng)與 Java 中的接口,制定了規(guī)范。

UTF-8 字符集

互聯(lián)網(wǎng)的普及,強(qiáng)烈要求出現(xiàn)一種統(tǒng)一的編碼方式。utf-8 應(yīng)運(yùn)而生,它就是 unicode 的其中之一的實(shí)現(xiàn)方式,相當(dāng)于 unicode 接口的實(shí)現(xiàn)類。

UTF-8最大的一個(gè)特點(diǎn),就是它是一種變長(zhǎng)的編碼方式。它可以使用 1~4 個(gè)字節(jié)表示一個(gè)符號(hào),根據(jù)不同的符號(hào)而變化字節(jié)長(zhǎng)度。這樣就直接解決了統(tǒng)一長(zhǎng)度造成的大量存儲(chǔ)資源浪費(fèi)的問(wèn)題,按需分配嘛。

那它是如何解決讀的問(wèn)題呢?解決方法如下

unicode 完全兼容 ASCII 碼,對(duì)于這部分字符,首字母為零,后七位為對(duì)應(yīng)的二進(jìn)制碼。如字母 A 對(duì)應(yīng)的二進(jìn)制形式是 01000001 。

對(duì)于需要占據(jù) n 字節(jié)的符號(hào),它第一個(gè)字節(jié)的前 n 位規(guī)定為 1 ,第 n+1 位規(guī)定為 0 ,后面 n -1 個(gè)字節(jié)的前兩位一律規(guī)定為 10 。例如,“嚴(yán)” 的 unicode 是 4E25(100111000100101),根據(jù) utf-8 的實(shí)現(xiàn)方式, "嚴(yán)" 的 UTF-8 編碼需要三個(gè)字節(jié),即格式是 "1110xxxx 10xxxxxx 10xxxxxx " 。

然后,從字符對(duì)應(yīng)的最后一個(gè)二進(jìn)制位開始,依次從后向前填入格式中的 x,多出的位補(bǔ) 0 。所以,"嚴(yán)"的 UTF-8 編碼是 "11100100 10111000 10100101"。

讀取時(shí),自動(dòng)忽略這些固定的描述信息后,再查看 unicode 規(guī)定的字符規(guī)范,就可以得到對(duì)應(yīng)字符了。

總結(jié)下就是,ASCII 只適用于英語(yǔ),而實(shí)現(xiàn)了 unicode 編碼的 utf-8 適用于所有的語(yǔ)言符號(hào),且兼容 ASCII 碼,所以以后所有涉及編碼的問(wèn)題,都指定為 utf-8 哦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,034評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,327評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,554評(píng)論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,337評(píng)論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,883評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評(píng)論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,114評(píng)論 0 286
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,625評(píng)論 1 332
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,555評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,737評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評(píng)論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,973評(píng)論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,615評(píng)論 1 280
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,343評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,699評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容