做程序猿這么多年,其實對各種編碼格式雖有了解诡蜓,但是讓我說出各個的區(qū)別和聯(lián)系熬甫,還真有點難度,所以万牺,把這些編碼格式梳理一遍罗珍,如下洽腺。
字符集
1. ASCII字符集
ASCII 碼使用指定的7 位二進制數(shù)組合來表示128種可能的字符。標準ASCII 碼也叫基礎ASCII碼覆旱,使用7 位二進制數(shù)(剩下的1位二進制為0)來表示所有的大寫和小寫字母蘸朋,數(shù)字0 到9、標點符號扣唱, 以及在美式英語中使用的特殊控制字符藕坯。
0~31及127(共33個)是控制字符或通信專用字符(其余為可顯示字符),如控制符:LF(換行)噪沙、CR(回車)炼彪、FF(換頁)、DEL(刪除)正歼、BS(退格)辐马、BEL(響鈴)等;通信專用字符:SOH(文頭)局义、EOT(文尾)喜爷、ACK(確認)等;ASCII值為8萄唇、9檩帐、10 和13 分別轉換為退格、制表另萤、換行和回車字符湃密。它們并沒有特定的圖形顯示,但會依不同的應用程序四敞,而對文本顯示有不同的影響泛源。
32~126(共95個)是字符(32是空格),其中48~57為0到9十個阿拉伯數(shù)字忿危。
65~90為26個大寫英文字母俩由,97~122號為26個小寫英文字母,其余為一些標點符號癌蚁、運算符號等。
后128個稱為擴展ASCII碼兜畸。許多基于x86的系統(tǒng)都支持使用擴展(或“高”)ASCII努释。擴展ASCII 碼允許將每個字符的第8 位用于確定附加的128 個特殊符號字符、外來語字母和圖形符號咬摇。
2. Unicode字符集
unicode是一個字符集伐蒂,里面幾乎包含了目前世界上已知的所有字符,且該字符集將二進制代碼和字符形成一一映射肛鹏。它為每種語言中的每個字符設定了統(tǒng)一并且唯一的二進制編碼逸邦,以滿足跨語言恩沛、跨平臺進行文本轉換、處理的要求缕减。
編碼格式
1. UTF-8編碼傳輸格式
Unicode字符集中對字符的編碼是長度不確定的雷客,其中有的字符是兩個字符,有的是三個字符桥狡,這給計算機進行解碼帶來了困難搅裙。
所以我們想給每個字符對應的二進制碼前加上一個標記,讓計算機看到這個標記就知道它將要讀取幾個字節(jié)裹芝,那么這個標記該怎么加呢部逮?
這就導致人們引入UTF-8,它的英文全稱是8-bit Unicode Transformation Format嫂易,可以看出它是將原本的Unicode碼進行了transformation兄朋,這種transformation 就是給每個Unicode碼進行標記,使得讓計算機看到某個標記就知道待會要讀取幾個字節(jié)的代碼怜械。
UTF-8編碼規(guī)則
UTF-8的編碼規(guī)則很簡單颅和,只有二條:
- 對于單字節(jié)的符號,字節(jié)的第一位設為0宫盔,后面7位為這個符號的unicode碼融虽。因此對于英語字母,UTF-8編碼和ASCII碼是相同的灼芭。
- 對于n字節(jié)的符號(n>1)有额,第一個字節(jié)的前n位都設為1,第n+1位設為0彼绷,后面字節(jié)的前兩位一律設為10巍佑。剩下的沒有提及的二進制位,全部為這個符號的unicode碼寄悯。
2. ANSI編碼格式
ANSI(American National Standards Institute)萤衰,中文:美國國家標準學會。
為使計算機支持更多語言猜旬,通常使用 0x80~0xFF 范圍的多個字節(jié)來表示 1 個字符脆栋。比如:漢字 '中' 在簡體中文Windows操作系統(tǒng)中,使用 [0xD6,0xD0] 這兩個字節(jié)存儲洒擦。對于ANSI編碼而言椿争,0x00~0x7F之間的字符,依舊是1個字節(jié)代表1個字符熟嫩。
在簡體中文Windows操作系統(tǒng)中秦踪,ANSI 編碼代表 GBK 編碼;在日文Windows操作系統(tǒng)中,ANSI 編碼代表 Shift_JIS 編碼椅邓。 不同 ANSI 編碼之間互不兼容柠逞,當信息在國際間交流時,無法將屬于兩種語言的文字景馁,存儲在同一段 ANSI 編碼的文本中板壮。
總之,需要將編碼格式和字符集兩個概念區(qū)分開來裁僧,再去理解會容易一些个束。