在編程領(lǐng)域,我們最常見(jiàn)就是各種編碼,最頭疼也是各種編碼。
utf-8 其實(shí)是最容易打交道一種編碼類型。 剛開(kāi)始code的時(shí)候,被質(zhì)問(wèn)為什么不用utf-8的時(shí)候就只能呈現(xiàn)一個(gè)大寫(xiě)的懵逼表情。
什么是編碼
在久遠(yuǎn)的計(jì)算機(jī)設(shè)計(jì)中,所有的字符編碼都是以8bit作為一個(gè)byte,一個(gè)字節(jié)所代表的數(shù)字有效值為0~255。所有要表達(dá)更大的數(shù)值,就只能使用更多的byte。計(jì)算機(jī)中所有字符(中文、英文、各種符號(hào)等)的顯示其實(shí)都是通過(guò)相應(yīng)的碼表進(jìn)行映射實(shí)現(xiàn)的。
比如我們使用ASCII碼去操作英文大小寫(xiě)字母和英文符號(hào)。
編碼類型
在ASCII設(shè)計(jì)時(shí),由于只有各種英文大小寫(xiě)和英文符號(hào),最后ASCII只包含了127個(gè)字符。
當(dāng)中國(guó)人接觸計(jì)算機(jī)想要在計(jì)算機(jī)里看到漢字和中文符號(hào),怎么辦呢。繼續(xù)占用ASCII沒(méi)用完的位置么,明顯是不夠用的。于是我們制定了一套新的編碼GB2312,但是全世界所有國(guó)家的計(jì)算機(jī)從業(yè)人員都會(huì)面臨一樣的問(wèn)題,比如韓文的Euc-kr,在各種編碼里肯定會(huì)存在沖突,于是在混合文本里就出現(xiàn)了亂碼的情況。
解決方案
那么處理這種問(wèn)題呢存在了一種大混合的編碼,用一種編碼包含各種不一樣的字符來(lái)亂碼問(wèn)題-這就是Unicode。
在Unicode中最常用的是用兩個(gè)字節(jié)表示一個(gè)字符,但是對(duì)于一些非常偏僻的字符,就需要4個(gè)字節(jié)。現(xiàn)在大部分的操作系統(tǒng)和各種編程語(yǔ)言都是支持Unicode編碼的。其實(shí)這里還有一個(gè)問(wèn)題就是空間浪費(fèi)。
對(duì)于一篇全是英文的文檔使用別的編碼比如兩個(gè)字節(jié)表示一個(gè)字符的編碼方式就會(huì)產(chǎn)生極大的空間浪費(fèi)。所有Unicode支持了可變長(zhǎng)編碼-utf-8。在utf-8中,最常用的英文字符是一個(gè)字節(jié),對(duì)于漢字則是三個(gè)字節(jié)而其余一些特別不常見(jiàn)的字符則設(shè)置成立4~6個(gè)字節(jié)。需要注意的是utf-8其實(shí)在運(yùn)行時(shí)效率并不如unicode高,所有一般的編碼的工作方式都需要經(jīng)過(guò)一次編碼轉(zhuǎn)換:
比如我們寫(xiě)代碼的時(shí)候,所有的字符都會(huì)以Unicode編碼讀取到內(nèi)存中,在存儲(chǔ)的時(shí)候在轉(zhuǎn)換成utf-8,
在瀏覽網(wǎng)頁(yè)的時(shí)候服務(wù)器用的是Unicode,然后轉(zhuǎn)成utf-8傳輸?shù)綖g覽器這也是我們?yōu)槭裁淳W(wǎng)頁(yè)上經(jīng)常有<meta charset="UTF-8" />信息的原因??偨Y(jié)一下其實(shí)就是子啊計(jì)算機(jī)內(nèi)存中,一般用的Unicode編碼而在傳輸或存儲(chǔ)的時(shí)候轉(zhuǎn)為utf-8文本。