utf-8到底是怎么回事?

熟悉計(jì)算機(jī)的同學(xué)一定聽(tīng)說(shuō)過(guò)編碼字符集這么個(gè)名詞。utf-8作為當(dāng)下被廣泛應(yīng)用的編碼字符集净神,大家也一定有所耳聞何吝。

對(duì)于電子計(jì)算機(jī)而言,處理器只能識(shí)別二進(jìn)制機(jī)器碼鹃唯。所以任何人類(lèi)可以進(jìn)行閱讀的電腦文件爱榕,其實(shí)只是一系列0和1的組合。是字符編碼規(guī)則坡慌,將機(jī)器可以識(shí)別的二進(jìn)制內(nèi)容轉(zhuǎn)換為人類(lèi)可以識(shí)別的各種文檔黔酥。

最早的編碼字符集ACSII,使用1字節(jié)表示128個(gè)字符八匠,一個(gè)字節(jié)是8位絮爷,也就是從0~127(二進(jìn)制區(qū)間為00000000~01111111),每一個(gè)數(shù)值都對(duì)應(yīng)著一個(gè)字符梨树。但是ASCII是為英語(yǔ)設(shè)計(jì)的,不能表示諸如漢語(yǔ)等其他語(yǔ)言的字符岖寞。

針對(duì)這個(gè)問(wèn)題抡四,大家可能會(huì)覺(jué)得,我們只要使用更多的字節(jié)仗谆,就可以有更大的整數(shù)范圍去和世界上所有的字符一一對(duì)應(yīng)指巡。這當(dāng)然是一種解決問(wèn)題的辦法,然而單純的擴(kuò)大字節(jié)數(shù)是有弊端的隶垮。假設(shè)我們可以使用4個(gè)字節(jié)表示所有字符藻雪,文件中每個(gè)字符都使用4個(gè)字節(jié)進(jìn)行表示,結(jié)果原本ASCII中僅需要一個(gè)字節(jié)就能表示的字符也占用了4個(gè)字節(jié)的空間狸吞,這就造成了極大的浪費(fèi)勉耀,要知道早期計(jì)算機(jī)的存儲(chǔ)設(shè)備不僅價(jià)格高昂而且容量小指煎。于是變長(zhǎng)編碼字符集應(yīng)運(yùn)而生,我們今天常見(jiàn)的utf-8就是變長(zhǎng)編碼字符集的一種便斥。

utf-8字符集與ACSII字符集是兼容的至壤,也就是說(shuō)可以被ASCII正常解讀的文件,可以被utf-8正常解讀枢纠,而且結(jié)果一致像街。那么utf-8究竟是怎么進(jìn)行編碼的呢?

我們發(fā)現(xiàn)ACSII雖然使用了一個(gè)字節(jié)來(lái)表示字符晋渺,但是最高位是沒(méi)有使用的镰绎。utf-8也使用每個(gè)字節(jié)的頭幾位來(lái)記錄關(guān)于字符編碼的信息。

例如對(duì)于漢字而言木西,utf-8需要3個(gè)字節(jié)來(lái)進(jìn)行表示跟狱,一般長(zhǎng)這個(gè)樣子:1110xxxx 10xxxxxx 10xxxxxx。對(duì)于第一個(gè)字節(jié)户魏,使用二進(jìn)制111表示這個(gè)字符需要3個(gè)字節(jié)驶臊,再加上一個(gè)0與實(shí)際要記錄的值隔開(kāi),最后4位是該字符實(shí)際二進(jìn)制值的最高4位叼丑。對(duì)于第二第三個(gè)字節(jié)关翎,最高兩位使用10占位,剩下的6位分別是該字符實(shí)際二進(jìn)制值的中間6位和最后6位鸠信。

與上面的表達(dá)方式類(lèi)似的纵寝,2個(gè)字節(jié)表示的字符,在二進(jìn)制下表示為:110xxxxx 10xxxxxx星立;4個(gè)字節(jié)表示的字符爽茴,在二進(jìn)制下表示為:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx;5個(gè)字節(jié)表示的字符绰垂,在二進(jìn)制下表示為:111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx室奏;6個(gè)字節(jié)表示的字符,在二進(jìn)制下表示為:1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx劲装。

實(shí)際上對(duì)于我們平時(shí)使用而言胧沫,4個(gè)字節(jié)已經(jīng)足夠了(即除ACSII字符外,還可以表示2^21-1個(gè)字符占业,約200萬(wàn)個(gè)字符)绒怨。而且使用超過(guò)4個(gè)字節(jié)表示字符也是不合utf-8規(guī)范的。

當(dāng)計(jì)算機(jī)根據(jù)utf-8編碼解碼文件時(shí)谦疾,如果遇到一個(gè)字節(jié)是以10開(kāi)頭的南蹂,那么立刻可以知道這不是一個(gè)字符的開(kāi)頭。通過(guò)向前或向后查找以110念恍、1110六剥、11110開(kāi)頭的字節(jié)開(kāi)始進(jìn)行解碼晚顷。而當(dāng)遇到以0開(kāi)頭的字節(jié)時(shí),自然按照ACSII碼來(lái)進(jìn)行處理仗考。

下面我使用go語(yǔ)言編寫(xiě)一段代碼音同,示例utf-8的編碼方式:

```go

s :=`中a`

fmt.Println("字節(jié)長(zhǎng)度",len(s))

for i :=0;i

fmt.Printf("十進(jìn)制字節(jié)值: %d,二進(jìn)制字節(jié)值: %08b\n",s[i],s[i])

}

fmt.Println("=======")

for i,r :=range s {

fmt.Printf("字符在串中的位置: %d,字符: %c,二進(jìn)制碼: %08b\n",i,r,r)

}

```

輸出結(jié)果為:

字節(jié)長(zhǎng)度 4

十進(jìn)制字節(jié)值: 228,二進(jìn)制字節(jié)值: 11100100

十進(jìn)制字節(jié)值: 184,二進(jìn)制字節(jié)值: 10111000

十進(jìn)制字節(jié)值: 173,二進(jìn)制字節(jié)值: 10101101

十進(jìn)制字節(jié)值: 97,二進(jìn)制字節(jié)值: 01100001

=======

字符在串中的位置: 0,字符: 中,二進(jìn)制碼: 100111000101101

字符在串中的位置: 3,字符: a,二進(jìn)制碼: 01100001

結(jié)果印證了上文中的描述。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末秃嗜,一起剝皮案震驚了整個(gè)濱河市权均,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锅锨,老刑警劉巖叽赊,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異必搞,居然都是意外死亡必指,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén)恕洲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)塔橡,“玉大人,你說(shuō)我怎么就攤上這事霜第「鸺遥” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵泌类,是天一觀的道長(zhǎng)癞谒。 經(jīng)常有香客問(wèn)我,道長(zhǎng)刃榨,這世上最難降的妖魔是什么弹砚? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮枢希,結(jié)果婚禮上桌吃,老公的妹妹穿的比我還像新娘。我一直安慰自己晴玖,他們只是感情好读存,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著呕屎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敬察。 梳的紋絲不亂的頭發(fā)上秀睛,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音莲祸,去河邊找鬼蹂安。 笑死椭迎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的田盈。 我是一名探鬼主播畜号,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼允瞧!你這毒婦竟也來(lái)了简软?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤述暂,失蹤者是張志新(化名)和其女友劉穎痹升,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體畦韭,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疼蛾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了艺配。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片察郁。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖转唉,靈堂內(nèi)的尸體忽然破棺而出皮钠,到底是詐尸還是另有隱情,我是刑警寧澤酝掩,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布鳞芙,位于F島的核電站,受9級(jí)特大地震影響期虾,放射性物質(zhì)發(fā)生泄漏原朝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一镶苞、第九天 我趴在偏房一處隱蔽的房頂上張望喳坠。 院中可真熱鬧,春花似錦茂蚓、人聲如沸壕鹉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)晾浴。三九已至,卻和暖如春牍白,著一層夾襖步出監(jiān)牢的瞬間脊凰,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工茂腥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狸涌,地道東北人切省。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像帕胆,于是被迫代替她去往敵國(guó)和親朝捆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348