編碼
UTF-8:
采用變長(zhǎng)字節(jié)(1 ASCII, 2希臘字母, 3漢字, 4平面符號(hào))表示陡舅。在網(wǎng)絡(luò)傳輸時(shí),即使錯(cuò)了一個(gè)字節(jié)纵潦,不影響其他字節(jié)偶房,而雙字節(jié)只要一個(gè)錯(cuò)了摆寄,其他也錯(cuò)了失暴,具體如下:
如果只有一個(gè)字節(jié)則其最高二進(jìn)制位為0坯门;如果是多字節(jié),其第一個(gè)字節(jié)從最高位開始逗扒,連續(xù)的二進(jìn)制位值為1的個(gè)數(shù)決定了其編碼的字節(jié)數(shù)古戴,其余各字節(jié)均以10開頭。UTF-8最多可用到6個(gè)字節(jié)矩肩。
UTF-16:
采用2字節(jié)现恼,Unicode中不同部分的字符都同樣基于現(xiàn)有的標(biāo)準(zhǔn)。這是為了便于轉(zhuǎn)換黍檩。
從0×0000到0×007F是ASCII字符叉袍,
從0×0080到0×00FF是ISO-8859-1對(duì)ASCII的擴(kuò)展。
希臘字母表使用從0×0370到0×03FF的代碼刽酱,
斯拉夫語(yǔ)使用從0×0400到0×04FF的代碼喳逛,
美國(guó)使用從0×0530到0×058F的代碼,
希伯來語(yǔ)使用從0×0590到0×05FF的代碼棵里。
中國(guó)润文、日本和韓國(guó)的象形文字(總稱為CJK)占用了從0×3000到0×9FFF的代碼;由于0×00在c語(yǔ)言及操作系統(tǒng)文件名等中有特殊意義殿怜,故很多情況下需要UTF-8編碼保存文本典蝌,去掉這個(gè)0×00。舉例如下:
UTF-16: 0×0080 ?= 0000 0000 1000 0000
UTF-8: ? 0xC280 = 1100 0010 1000 0000
UTF-32:采用4字節(jié)头谜。
優(yōu)缺點(diǎn)
UTF-8骏掀、UTF-16和UTF-32都可以表示有效編碼空間(U+000000-U+10FFFF)內(nèi)的所有Unicode字符。
使用UTF-8編碼時(shí)ASCII字符只占1個(gè)字節(jié)乔夯,存儲(chǔ)效率比較高砖织,適用于拉丁字符較多的場(chǎng)合以節(jié)省空間。
對(duì)于大多數(shù)非拉丁字符(如中文和日文)來說末荐,UTF-16所需存儲(chǔ)空間最小,每個(gè)字符只占2個(gè)字節(jié)新锈。
Windows NT內(nèi)核是Unicode(UTF-16)甲脏,采用UTF-16編碼在調(diào)用系統(tǒng)API時(shí)無需轉(zhuǎn)換,處理速度也比較快妹笆。
采用UTF-16和UTF-32會(huì)有Big Endian和Little Endian之分块请,而UTF-8則沒有字節(jié)順序問題,所以UTF-8適合傳輸和通信拳缠。
UTF-32采用4字節(jié)編碼墩新,一方面處理速度比較快,但另一方面也浪費(fèi)了大量空間窟坐,影響傳輸速度海渊,因而很少使用绵疲。
如何判斷字符集
1字節(jié)序
首先說一下字節(jié)序?qū)幋a的影響,字節(jié)序分為Big Endian字節(jié)序和Little Endian字節(jié)序臣疑。不同的處理器可能不一樣盔憨。所以,傳輸時(shí)需要告訴處理器當(dāng)時(shí)的編碼字節(jié)序讯沈。對(duì)于前者而言郁岩,高位字節(jié)存在低地址,低字節(jié)存于高地址缺狠;后者相反问慎。例如,0X03AB,
Big Endian字節(jié)序
0000: 0 3
0001: AB
Little Endian字節(jié)序是
0000: AB
0001: 0 3
2編碼識(shí)別
UNICODE挤茄,根據(jù)前幾個(gè)字節(jié)可以判斷UNICODE字符集的各種編碼蝴乔,叫做Byte Order Mask方法BOM:
UTF-8: EFBBBF (符合UTF-8格式,請(qǐng)看上面驮樊。但沒有含義在UCS即UNICODE中)
UTF-16 Big Endian:FEFF (沒有含義在UCS-2中)
UTF-16 Little Endian:FFFE (沒有含義在UCS-2中)
UTF-32 Big Endian:0000FEFF (沒有含義在UCS-4中)
UTF-32 Little Endian:FFFE0000 (沒有含義在UCS-4中)
GB2312:高字節(jié)和低字節(jié)的第1位都是1薇正。
BIG5,GBK&GB18030:高字節(jié)的第1位為1囚衔。