編碼學習筆記,資料來源互聯網,持續更新
1 ASCII
- American Standard Code for Information Interchange,美國信息交換標準代碼。
- 用7位表示128個字符,針對英語設計。
- 0~31、127(33個):控制字符
-
32~126(95個):可顯示字符
ASCII碼對應表
2 ISO 8859-1
用8位表示256個字符
3 Unicode
??很多傳統的編碼方式都有一個共同的問題,即容許電腦處理雙語環境(通常使用拉丁字母以及其本地語言),但卻無法同時支持多語言環境(指可同時處理多種語言混合的情況)。
??Unicode(統一碼、萬國碼、單一碼)是為了解決傳統的字符編碼方案的局限而產生的,它為每種語言中的每個字符設定了統一并且唯一的二進制編碼,以滿足跨語言、跨平臺進行文本轉換、處理的要求。
3.1 編碼
??目前的Unicode字符分為17組編排,0x0000 至 0x10FFFF,每組稱為平面(Plane),而每平面擁有65536個碼位,共1114112個。在第0平面中,中文范圍是0x4E00-0x9FA5。
3.2 UTF
??對可以用ASCII表示的字符使用Unicode并不高效,因為Unicode比ASCII占用大一倍的空間,而對ASCII來說高字節的0對他毫無用處。為了解決這個問題,就出現了一些中間格式的字符集,他們被稱為通用轉換格式,即UTF(Unicode Transformation Format)。常見的UTF格式有:UTF-7, UTF-7.5, UTF-8, UTF-16以及UTF-32。
??在Unicode中,“漢字”兩個字對應的十六進制是分別是0x6c49和0x5b57,通過編碼:
char data_utf8[]={0xE6,0xB2,0x94,0xE5,0xAD,0x97};//UTF-8編碼
char16_t data_utf16[]={0x6C49,0x5B57}; //UTF-16編碼
char32_t data_utf32[]={0x00006C49,0x00005B57}; //UTF-32編碼
??這里用char、char16_t、char32_t分別表示無符號8位整數,無符號16位整數和無符號32位整數。UTF-8、UTF-16、UTF-32分別以char、char16_t、char32_t作為編碼單位。“漢字”的UTF-8編碼需要6個字節?!皾h字”的UTF-16編碼需要4個字節?!皾h字”的UTF-32編碼8個字節。根據字節序的不同,UTF-16可以被實現為UTF-16LE或UTF-16BE,UTF-32可以被實現為UTF-32LE或UTF-32BE。
??下面分別介紹UTF-8/16/32如何編碼。
3.2.1 UTF-8
UTF-8編碼規則:如果只有一個字節則其最高二進制位為0;如果是多字節,其第一個字節從最高位開始,連續的二進制位值為1的個數決定了其編碼的字節數,其余各字節均以10開頭。UTF-8轉換表表示如下:
Unicode/UCS-4 | bit數 | UTF-8 | byte數 |
---|---|---|---|
0000~ 007F | 0~7 | 0XXX XXXX | 1 |
0080~ 07FF | 8~11 | 110X XXXX 10XX XXXX |
2 |
0800~ FFFF | 12~16 | 1110 XXXX 10XX XXXX 10XX XXXX |
3 |
1 0000~ 1F FFFF | 17~21 | 1111 0XXX 10XX XXXX 10XX XXXX 10XX XXXX |
4 |