一、定義
字符集是一批字符的集合,每個字符對應(yīng)一個特殊的字符編號,計算機(jī)要存儲字符,需要通過字符集找到字符編號,并轉(zhuǎn)化為二進(jìn)制數(shù)據(jù)存儲在內(nèi)存中。常用的字符集有ASCII 字符集和Unicode字符集。
二、數(shù)據(jù)的解碼和存儲過程
字符的存儲大致分為倆步,第一是將字符通過特定的字符集轉(zhuǎn)化為字符編號,第二是將字符編號轉(zhuǎn)化為二進(jìn)制寫入內(nèi)存,解碼正好是一個逆過程,從二進(jìn)制數(shù)據(jù)轉(zhuǎn)化為編號再轉(zhuǎn)為字符最終顯示在屏幕上。
解碼的過程中就拋出了一個問題比如有下面一段二進(jìn)制數(shù)據(jù)'11001111100101110111001110001'我們?nèi)绾螖嘣~?這段數(shù)字代表幾個字符?
針對這個問題,主流的有倆種方法處理:
定長處理:
比如ASCII采用一個字節(jié),也就是8bit的長度代表一個字符,
這種方法的缺點(diǎn)是,8位二進(jìn)制,最多只能容納個字符
特殊標(biāo)記處理:
比如utf-8等,在這里需要明確一點(diǎn),計算機(jī)的最小存儲單位是bit,一個字節(jié)等于8bit,計算機(jī)讀取一個完整字節(jié)的速度最快,所以在存儲和解碼的過程中都是以B位最小單位的。因此這種解碼方法一般是以從最高位開始有幾個連續(xù)的1來標(biāo)記第一個字符的二進(jìn)制編碼占用了幾個字節(jié)的數(shù)據(jù)。
三、ASCII 字符集
ASCII 總共包含 128 個字符,主要包括英文字母,阿拉伯?dāng)?shù)字,和一些符號,用 7 個比特位(Bit)恰好能夠存儲,不過考慮到計算機(jī)一般把字節(jié)(Byte)作為基本單元,為了操作方便,我們不妨用一個字節(jié)(也就是 8 個比特位)來存儲 ASCII。這樣雖然浪費(fèi)了一個比特位,但是讀寫效率提高了。
四、Unicode字符集
Unicode 為了兼容 ASCII,在設(shè)計時刻意保留了原來 ASCII 中字符的編號,所以英文字母和阿拉伯?dāng)?shù)字在 Unicode 中的編號都非常小,用一個字節(jié)足以容納。中是一個漢字,編號比較大,一般要用兩個字節(jié)才能容納。
unicode不能單獨(dú)使用需要配合utf才能正常使用,這是因?yàn)?,unicode僅僅定義了字符與其對應(yīng)的字符編號,對于如何斷詞并沒有規(guī)定在內(nèi),而utf正是用來處理這一部分的,他在unicode的基礎(chǔ)上建立一個unicode編號與utf編號的映射關(guān)系,而utf編號是一組以特殊標(biāo)記開頭的編號,因此unicode+任意一種utf便可完成字符的存儲與二進(jìn)制數(shù)據(jù)的解碼。
unicode有三種編碼方式,utf-8 utf-16 utf-32,后倆種不常用,這里只介紹下utf-8
utf-8
UTF-8 的編碼規(guī)則很簡單:如果只有一個字節(jié),那么最高的比特位為 0;如果有多個字節(jié),那么第一個字節(jié)從最高位開始,連續(xù)有幾個比特位的值為 1,就使用幾個字節(jié)編碼,剩下的字節(jié)均以 10 開頭。
具體的表現(xiàn)形式為:
0xxxxxxx:單字節(jié)編碼形式,這和 ASCII 編碼完全一樣,因此 UTF-8 是兼容 ASCII 的;
110xxxxx 10xxxxxx:雙字節(jié)編碼形式;
1110xxxx 10xxxxxx 10xxxxxx:三字節(jié)編碼形式;
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx:四字節(jié)編碼形式。
xxx 就用來存儲 Unicode 中的字符編號,不足8位的需要進(jìn)行補(bǔ)0。
| 字符 | unicode(16) | unicode(2) | utf-8 | utf-8(2) |
|---|---|---|---|---|
| 中 | u4e2d | 1001110 00101101 | 中 |
*黑色代表幾個字節(jié)
*藍(lán)色補(bǔ)零
*紅色unicode編號