前言
開發(fā)的過程中經(jīng)常要對文本進(jìn)行編碼之后再傳給服務(wù)器,比如說上傳表情到服務(wù)器,這個(gè)時(shí)候經(jīng)常會用到什么UTF-8編碼,有的人又說什么Unicode編碼,這兩者都是什么之前一直似懂非懂,自作主張的人為是兩種不同的字符編碼方式。經(jīng)過一系列百度之后對這個(gè)問題有個(gè)更成熟的理解,在此做個(gè)筆記。
首先Unicode是一個(gè)字符集,很牛,它包含世界上所有的字符,每個(gè)字符對應(yīng)一個(gè)二進(jìn)制編碼,用兩個(gè)字節(jié)保存。這樣的話所有國家的所有字符都可以在網(wǎng)絡(luò)上自由的傳輸,但是這樣做有個(gè)問題就是本來英文字母A,用ASCII編碼是十進(jìn)制的65,二進(jìn)制的01000001,一個(gè)字節(jié)就可以保存,如果按照Unicode的標(biāo)準(zhǔn)需要兩個(gè)字節(jié)保存,白白浪費(fèi)了一個(gè)字節(jié),這樣肯定不好,如果我是美國人也不想要這樣的結(jié)局,所以就通過人們的智慧就出現(xiàn)了UTF-8。
UTF-8編碼把一個(gè)Unicode字符根據(jù)不同的數(shù)字大小編碼成1-6個(gè)字節(jié),常用的英文字母被編碼成1個(gè)字節(jié),漢字通常是3個(gè)字節(jié),只有很生僻的字符才會被編碼成4-6個(gè)字節(jié)。那么通過UTF-8編碼之后字母A只需要一個(gè)字節(jié)就可以了,這樣美國人就比較開心了,但中國人又不太開心,因?yàn)闈h字通過UTF-8編碼之后通常需要三個(gè)字節(jié),多花了一個(gè)字節(jié),這個(gè)時(shí)候相比中國自己的GB2312編碼方式顯得不是很厚道,但為了世界統(tǒng)一,UTF-8的出現(xiàn)利大于弊,如果每個(gè)國家都按照自己的方式來,互聯(lián)網(wǎng)就亂了。UTF-8編碼有一個(gè)額外的好處,就是ASCII編碼實(shí)際上可以被看成是UTF-8編碼的一部分,所以,大量只支持ASCII編碼的歷史遺留軟件可以在UTF-8編碼下繼續(xù)工作。
UTF-8編碼規(guī)則
1. 單字節(jié)的字符,字節(jié)的第一位設(shè)為0,對于英語文本,UTF-8碼只占用一個(gè)字節(jié),和ASCII碼完全相同;
2. n個(gè)字節(jié)的字符(n>1),第一個(gè)字節(jié)的前n位設(shè)為1,第n+1位設(shè)為0,后面字節(jié)的前兩位都設(shè)為10,這n個(gè)字節(jié)的其余空位填充該字符unicode碼,高位用0補(bǔ)足。
這樣就形成了如下的UTF-8標(biāo)記位:
0xxxxxxx
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
總結(jié)
在計(jì)算機(jī)內(nèi)存中,統(tǒng)一使用Unicode編碼,當(dāng)需要保存到硬盤或者需要傳輸?shù)臅r(shí)候,就轉(zhuǎn)換為UTF-8編碼。所以UTF-8的出現(xiàn)是為了更好的存儲和網(wǎng)絡(luò)傳輸,如果傳輸?shù)膬?nèi)容多為字母,那么這種方式將會節(jié)約不少流量,就醬。