字符集
字符集定義了二進(jìn)制和字符間的對應(yīng)關(guān)系,為每個字符分配了唯一的編號,可以理解成一個很大的表格列出了所有字符和二進(jìn)制的對應(yīng)關(guān)系,計算機(jī)顯示文字或者存儲文字,就是一個查表的過程。
我們平常在稱呼ASCll,unicode,時候,經(jīng)常稱呼他們ASCll碼,unicode編碼,用GBK編碼,但是嚴(yán)格意義上來說,ASCll,unicode,GBK是字符集,是把計算機(jī)中的0101 0101 與 “abc、漢字,其他文字” 一一對應(yīng)起來的一套字符集。
ASCll是美國那邊發(fā)明的一套字符集,采用一個字節(jié)來存儲英文字母,阿拉伯?dāng)?shù)字等,0000 0000后七位存儲2^7 = 128 個字符,這樣我們收到一個8位二進(jìn)制數(shù)據(jù)就可以通過ASCll表中查出對應(yīng)的字母。
但是每個國家的語言文字不同,一個字節(jié)的后七位,肯定不夠存儲,所以就有了每個國家不同的字符集對照表,例如中國的GBK字符集,采用兩個字節(jié)來存儲漢字,如 “字” ,在計算機(jī)二進(jìn)制數(shù)據(jù)就是0000 0000 0000 0000 這種形式。很多地方稱呼GBK編碼也是沒有不對,因為GBK和ASCll等一些字符集在創(chuàng)造的時候就考慮了編碼,很難區(qū)分兩者的概念。
后來為了統(tǒng)一各國之間的字符集,創(chuàng)造了unicode字符集,又稱之為萬國碼。
編碼方案
上面的GBK,ASCll,Unicode只是給字符定義了編號,二進(jìn)制數(shù)據(jù)就相當(dāng)于他們的編號。
我們還需要UTF8,UTF16,UTF32 等編碼方案Unicode
字符存儲到計算機(jī)中。上面的三種編碼方案就是Unicode的編碼方案
- UTF 是 Unicode Transformation Format 的縮寫,意思是“Unicode轉(zhuǎn)換格式”,后面的數(shù)字表明至少使用多少個比特位(Bit)來存儲字符。
- UTF-8,一種可以變長變短的編碼方案,使用1-6個字節(jié)存儲。
- UTF-32, 一種固定長度的編碼方案,不管字符編號大小,始終使用4個字節(jié)來存儲。
- UTF-16,介于上面兩種編碼方案之間,采用2個或者4個字節(jié),長度既固定又可變。
UTF-8編碼規(guī)則:
看最高字節(jié),有幾個1就用幾個字節(jié)來編碼。如果是0則用一個字節(jié)存儲。
- 0xxxxxxx:單字節(jié)編碼形式,這和 ASCII 編碼完全一樣,因此 UTF-8 - - 是兼容 ASCII 的;
- 110xxxxx 10xxxxxx:雙字節(jié)編碼形式(第一個字節(jié)有兩個連續(xù)的 1);
- 1110xxxx 10xxxxxx 10xxxxxx:三字節(jié)編碼形式(第一個字節(jié)有三個連續(xù)的 1);
- 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx:四字節(jié)編碼形式(第一個字節(jié)有四個連續(xù)的 1)。
對于常用字符,它的Unicode編號范圍0~FFFF,1~3個字節(jié)存儲,只有少數(shù)地區(qū)使用的字符才需要4~6個字節(jié)存儲。
UTF-32編碼規(guī)則
UTF-32是固定長度的編碼,始終占用4個字節(jié),足以容納所有的Unicode字符,所以直接存儲Unicode編號即可。浪費了空間,提高了效率。
UTF-16編碼規(guī)則
對于Unicode編號范圍在0~FFFF之間的字符,UTF-16使用兩個字節(jié)存儲,并且直接存儲Unicode編號,不用進(jìn)行編碼轉(zhuǎn)換,這和UTF-32非常類似。
以上三種編碼只有UTF-8兼容ASCll,UTF-32和UTF-16都不兼容ASCll,因為它們沒有單子節(jié)編碼。