當(dāng)我上第一節(jié)計(jì)算機(jī)課的時(shí)候,我的電腦老師跟我說(shuō),一個(gè)英文字符是1個(gè)字節(jié),一個(gè)中文是2個(gè)字節(jié)。這么多年來(lái),我對(duì)此一直堅(jiān)信不移,相信很多人也是這么覺(jué)得的,但是,真實(shí)情況下是這么一回事么?
要了解這個(gè)問(wèn)題,我們首先得從字節(jié)說(shuō)起,什么是字節(jié)呢?要知道,在計(jì)算中,底層都是晶體管的開關(guān)和關(guān)閉狀態(tài),我們把一個(gè)表示開關(guān)狀態(tài)的稱之為位,把八位稱之為一個(gè)字節(jié),也就是一個(gè)字節(jié)可以表示(00000000-11111111),也就是0到255。為什么是8位呢?因?yàn)樽址麑?shí)際上還不到128個(gè),按道理7位就夠了,一個(gè)說(shuō)法是程序員也比較迷信,認(rèn)為7是個(gè)不吉利的數(shù)字,另一種說(shuō)法,8剛好是2^3的方,更容易計(jì)算機(jī)去理解。
ASCII(美國(guó)信息交換標(biāo)準(zhǔn)代碼)是美國(guó)人用來(lái)對(duì)拉丁字符進(jìn)行的編碼。因?yàn)橛?jì)算機(jī)是美國(guó)人發(fā)明的,所以他們也沒(méi)考慮其他國(guó)家可能也要用到計(jì)算機(jī)。下面是一個(gè)ASCII編碼的對(duì)應(yīng)表。
后來(lái)隨著計(jì)算機(jī)的發(fā)展,一些不是拉丁字母的國(guó)家也開始用計(jì)算機(jī)了,發(fā)現(xiàn)一個(gè)字節(jié)只能表示256個(gè)字符,這明顯不夠,像我們漢字博大精深,常用的都有幾千個(gè),于是常見的中文的編碼GB2312(國(guó)家簡(jiǎn)體中文字符集)就出現(xiàn)了。GB2312用兩個(gè)字節(jié)來(lái)表示一個(gè)漢字,例如學(xué)習(xí)的學(xué),對(duì)應(yīng)的編碼就是10010010 0000111。這也就是小時(shí)候我們的電腦老師跟我們說(shuō)的,在計(jì)算機(jī)中,英文字母占1個(gè)字節(jié),漢字占2個(gè)字節(jié)。
隨著互聯(lián)網(wǎng)的繼續(xù)發(fā)展,不同的國(guó)家,不同的語(yǔ)言都用著不同的編碼,每當(dāng)不同的人進(jìn)行交流,都要先知道對(duì)方用的是什么編碼,這往往就造成了溝通的成本,而且經(jīng)常因?yàn)榫幋a錯(cuò)誤造成各種烏龍。于是,國(guó)際上就定一了一種全新的編碼方法,全世界所有的字符、文字都有對(duì)應(yīng)的一個(gè)編碼,以后,就不需要轉(zhuǎn)化成不同的編碼了,這便是Unicode編碼。Unicode編碼使用4個(gè)字節(jié)來(lái)描述一個(gè)字符,每個(gè)字節(jié)8位,理論上就能表示2^32個(gè)不同的字符,全世界的字符都沒(méi)這么多。
但隨之又引來(lái)一個(gè)問(wèn)題,原先一個(gè)英文字符需要1個(gè)字節(jié),一個(gè)中文需要兩個(gè)字節(jié),現(xiàn)在需要4個(gè)字節(jié),相當(dāng)于存儲(chǔ)變大了。這給網(wǎng)絡(luò)傳輸、系統(tǒng)存儲(chǔ)都帶來(lái)了一定的成本。這個(gè)時(shí)候,人們覺(jué)得壓縮一下,于是提出了UTF8,UTF16這樣的表示方法,UTF8我們最經(jīng)常使用,怎么表示呢?對(duì)于一個(gè)漢字,例如上述學(xué)習(xí)的學(xué)字在Unicode編碼中表示為00000000 00000000 01011011 01100110。很明顯,前面字節(jié)都是0,非常的浪費(fèi),最好是能夠把它壓縮起來(lái),又能讓別人知道它原來(lái)對(duì)應(yīng)的就是四個(gè)字節(jié),怎么辦呢?UTF8就是為了解決這個(gè)問(wèn)題,對(duì)于原來(lái)是雙字符的中文,會(huì)變成3個(gè)字節(jié),第一個(gè)字節(jié)以1110開頭,后面兩個(gè)以10開頭。剩下的16位分?jǐn)偟竭@3個(gè)字節(jié)當(dāng)中。圖中便是這個(gè)學(xué)字如何從Unicode編碼轉(zhuǎn)成utf8編碼。
聯(lián)系客服