ASCII(American Standard Code for Information Interchange篓吁,美國信息交換標(biāo)準(zhǔn)代碼):
它是現(xiàn)今最早最通用的單字節(jié)編碼系統(tǒng),并等同于國際標(biāo)準(zhǔn)ISO/IEC 646,其中一個英文字母(不分大小寫)占一個字節(jié)的空間枷莉。
引申:字節(jié)是指一小組相鄰的二進制數(shù)碼徒仓。通常是8位作為一個字節(jié),如00001111,換算為十進制趁冈。最小值-128,最大值127。
標(biāo)準(zhǔn)ASCII 碼也叫基礎(chǔ)ASCII碼渗勘,使用7 位二進制數(shù)(剩下的1位二進制為0)來表示所有的大寫和小寫字母沐绒,數(shù)字0 到9、標(biāo)點符號旺坠, 以及在美式英語中使用的特殊控制字符乔遮。其中:
1)0~31及127(共33個)是控制字符或通信專用字符(其余為可顯示字符),如控制符:LF(換行)取刃、CR(回車)蹋肮、FF(換頁)、DEL(刪除)璧疗、BS(退格)坯辩、BEL(響鈴)等;通信專用字符:SOH(文頭)崩侠、EOT(文尾)漆魔、ACK(確認(rèn))等;ASCII值為8却音、9改抡、10 和13 分別轉(zhuǎn)換為退格、制表僧家、換行和回車字符雀摘。它們并沒有特定的圖形顯示,但會依不同的應(yīng)用程序八拱,而對文本顯示有不同的影響阵赠。
2)32~126(共95個)是字符(32是空格),其中48~57為0到9十個阿拉伯?dāng)?shù)字肌稻。
3)65~90為26個大寫英文字母清蚀,97~122號為26個小寫英文字母,其余為一些標(biāo)點符號爹谭、運算符號等枷邪。
同時還要注意,在標(biāo)準(zhǔn)ASCII中诺凡,其最高位(b7)用作奇偶校驗位东揣。所謂奇偶校驗,是指在代碼傳送過程中用來檢驗是否出現(xiàn)錯誤的一種方法腹泌,一般分奇校驗和偶校驗兩種嘶卧。奇校驗規(guī)定:正確的代碼一個字節(jié)中1的個數(shù)必須是奇數(shù),若非奇數(shù)凉袱,則在最高位b7添1芥吟;偶校驗規(guī)定:正確的代碼一個字節(jié)中1的個數(shù)必須是偶數(shù)侦铜,若非偶數(shù),則在最高位b7添1钟鸵。
ASCII碼表:http://tool.oschina.net/commons?type=4
GB2312(《信息交換用漢字編碼字符集》)
是由中國國家標(biāo)準(zhǔn)總局1980年發(fā)布钉稍,1981年5月1日開始實施的一套國家標(biāo)準(zhǔn),標(biāo)準(zhǔn)號是GB2312—1980棺耍。
GB2312編碼適用于漢字處理贡未、漢字通信等系統(tǒng)之間的信息交換,通行于中國大陸烈掠;新加坡等地也采用此編碼羞秤。中國大陸幾乎所有的中文系統(tǒng)和國際化的軟件都支持GB2312。GB2312標(biāo)準(zhǔn)共收錄6763個漢字左敌,基本滿足了漢字的計算機處理需要瘾蛋,它所收錄的漢字已經(jīng)覆蓋中國大陸99.75%的使用頻率。對于人名矫限、古漢語等方面出現(xiàn)的罕用字哺哼,GB2312不能處理,這導(dǎo)致了后來GBK及GB 18030漢字字符集的出現(xiàn)叼风。
1)GB2312用一個字節(jié)表示一個英文字符和一些基本符號和半角符號取董,用兩個字節(jié)表示一個漢字和全角符號和一些我們?nèi)粘J褂玫姆枴?/p>
2)GB2312利用了ASCII的127個字符之后空余的部分,增添了6000多種常用漢字无宿。
3)數(shù)值小于127的字節(jié)表示ASCII中原有字符茵汰,兩個連續(xù)數(shù)值都大于127的字節(jié)表示一個漢字字符。
4)使用GB2312編碼孽鸡,當(dāng)讀取到一個數(shù)值上小于127的字節(jié)時當(dāng)作一個ASCII中原有的字符處理蹂午。讀到一個數(shù)值大于127的字節(jié)時會繼續(xù)讀取下一個字節(jié),下一個字節(jié)的數(shù)值也必定是大于127彬碱,將兩個大于127的字節(jié)一起組合形成一個字符豆胸。
5)每個漢字及符號以兩個字節(jié)來表示。第一個字節(jié)稱為“高位字節(jié)”(也稱“區(qū)字節(jié))”巷疼,第二個字節(jié)稱為“低位字節(jié)”(也稱“位字節(jié)”)晚胡,例如“啊”字在大多數(shù)程序中,會以兩個字節(jié)嚼沿,0xB0(第一個字節(jié)) 0xA1(第二個字節(jié))儲存估盘。
GB2312碼表:http://tools.jb51.net/table/gb2312
GBK(《通用多八位編碼字符集》)
GB2312有局限性,只能表示6000個字符骡尽,GBK是對GB2312的升級忿檩,共收錄了21003個漢字,GBK與GB2312非常相似爆阶,唯一的不同:
使用GBK編碼,當(dāng)讀取到一個數(shù)值上小于127的字節(jié)時當(dāng)作一個ASCII中原有的字符處理。讀到一個數(shù)值大于127的字節(jié)時必定會繼續(xù)讀取下一個字節(jié)辨图,下一個字節(jié)的數(shù)值無需大于127班套,將兩個字節(jié)一起組合形成一個漢字字符。
GBK 向下與 GB2312 編碼兼容故河,向上支持 ISO 10646.1國際標(biāo)準(zhǔn)吱韭,ISO 10646 是國際化標(biāo)準(zhǔn)組織 ISO 公布的一個編碼標(biāo)準(zhǔn),大陸譯為《通用多八位編碼字符集》,ISO 10646.1 是該標(biāo)準(zhǔn)的第一部分《體系結(jié)構(gòu)與基本多文種平面》。我國 1993 年以 GB 13000.1 國家標(biāo)準(zhǔn)的形式予以認(rèn)可(即 GB 13000.1 等同于 ISO 10646.1)鱼的。
Unicode(Universal Multiple-Octet Coded Character Set理盆,簡稱:UC)
unicode編碼表中包含了世界上所有國家的所有字符和符號的編碼。 在最新的規(guī)范中凑阶,所有的字符一概使用四個字節(jié)表示猿规,不夠的就往前面補 0。這樣確實可以解決編碼問題宙橱,但是卻造成了空間的極大浪費姨俩,如果是一個英文文檔,那文件大小就大出了 3 倍师郑,這顯然是無法接受的环葵。
于是,為了較好的解決 Unicode 的編碼問題宝冕, UTF-8 和 UTF-16 兩種當(dāng)前比較流行的編碼方式誕生了张遭。當(dāng)然還有一個 UTF-32 的編碼方式,也就是上述那種定長編碼地梨,字符統(tǒng)一使用 4 個字節(jié)菊卷,雖然看似方便,但是卻不如另外兩種編碼方式使用廣泛湿刽。
UTF-8
UTF-8 是目前互聯(lián)網(wǎng)上使用最廣泛的一種 Unicode 編碼方式的烁,它的最大特點就是可變長。它可以使用 1 - 4 個字節(jié)表示一個字符诈闺,根據(jù)字符的不同變換長度渴庆。編碼規(guī)則如下:
1)對于單個字節(jié)的字符,第一位設(shè)為 0雅镊,后面的 7 位對應(yīng)這個字符的 Unicode 碼點襟雷。因此,對于英文中的 0 - 127 號字符仁烹,與 ASCII 碼完全相同耸弄。這意味著 ASCII 碼那個年代的文檔用 UTF-8 編碼打開完全沒有問題。
2)對于需要使用 N 個字節(jié)來表示的字符(N > 1)卓缰,第一個字節(jié)的前 N 位都設(shè)為 1计呈,第 N + 1 位設(shè)為0砰诵,剩余的 N - 1 個字節(jié)的前兩位都設(shè)位 10,剩下的二進制位則使用這個字符的 Unicode 碼點來填充捌显。
序號 | Unicode | UTF-8 |
---|---|---|
1 | 0000 0000 - 0000 007F | 0xxxxxxx |
2 | 0000 0080 - 0000 07FF | 110xxxxx 10xxxxxx |
3 | 0000 0800 - 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
4 | 0001 0000 - 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
下面以漢字“漢”為利茁彭,具體說明如何進行 UTF-8 編碼和解碼,大家就很容易理解了扶歪。
“漢”的 Unicode 碼點是 0x6c49(110 1100 0100 1001)理肺,通過上面的對照表可以發(fā)現(xiàn),0x0000 6c49 位于第三行的范圍善镰,那么得出其格式為 1110xxxx 10xxxxxx 10xxxxxx妹萨。接著,從“漢”的二進制數(shù)最后一位開始炫欺,從后向前依次填充對應(yīng)格式中的 x乎完,多出的 x 用 0 補上。這樣竣稽,就得到了“漢”的 UTF-8 編碼為 11100110 10110001 10001001囱怕,轉(zhuǎn)換成十六進制就是 0xE6 0xB7 0x89。
UTF-16
在了解 UTF-16 編碼方式之前毫别,先了解一下另外一個概念——“平面”娃弓。
在上面的介紹中,提到了 Unicode 是一本很厚的字典岛宦,她將全世界所有的字符定義在一個集合里台丛。這么多的字符不是一次性定義的,而是分區(qū)定義砾肺。每個區(qū)可以存放 65536 個(216216)字符挽霉,稱為一個平面(plane)。目前变汪,一共有 17 個(2525)平面侠坎,也就是說,整個 Unicode 字符集的大小現(xiàn)在是 221221裙盾。
最前面的 65536 個字符位实胸,稱為基本平面(簡稱 BMP ),它的碼點范圍是從 0 到 216?1216?1番官,寫成 16 進制就是從 U+0000 到 U+FFFF庐完。所有最常見的字符都放在這個平面,這是 Unicode 最先定義和公布的一個平面徘熔。剩下的字符都放在輔助平面(簡稱 SMP )门躯,碼點范圍從 U+010000 到 U+10FFFF。
基本了解了平面的概念后酷师,再說回到 UTF-16讶凉。UTF-16 編碼介于 UTF-32 與 UTF-8 之間染乌,同時結(jié)合了定長和變長兩種編碼方法的特點。它的編碼規(guī)則很簡單:基本平面的字符占用 2 個字節(jié)缀遍,輔助平面的字符占用 4 個字節(jié)慕匠。也就是說,UTF-16 的編碼長度要么是 2 個字節(jié)(U+0000 到 U+FFFF)域醇,要么是 4 個字節(jié)(U+010000 到 U+10FFFF)。那么問題來了蓉媳,當(dāng)我們遇到兩個字節(jié)時譬挚,到底是把這兩個字節(jié)當(dāng)作一個字符還是與后面的兩個字節(jié)一起當(dāng)作一個字符呢?
這里有一個很巧妙的地方酪呻,在基本平面內(nèi)减宣,從 U+D800 到 U+DFFF 是一個空段,即這些碼點不對應(yīng)任何字符玩荠。因此漆腌,這個空段可以用來映射輔助平面的字符。
輔助平面的字符位共有 220220 個阶冈,因此表示這些字符至少需要 20 個二進制位闷尿。UTF-16 將這 20 個二進制位分成兩半,前 10 位映射在 U+D800 到 U+DBFF女坑,稱為高位(H)填具,后 10 位映射在 U+DC00 到 U+DFFF,稱為低位(L)匆骗。這意味著劳景,一個輔助平面的字符,被拆成兩個基本平面的字符表示碉就。
因此盟广,當(dāng)我們遇到兩個字節(jié),發(fā)現(xiàn)它的碼點在 U+D800 到 U+DBFF 之間瓮钥,就可以斷定筋量,緊跟在后面的兩個字節(jié)的碼點,應(yīng)該在 U+DC00 到 U+DFFF 之間骏庸,這四個字節(jié)必須放在一起解讀毛甲。