計算機編碼世界(一)

一. 基礎知識

計算機中儲存的信息都是用二進制數表示的;而我們在屏幕上看到的英文、漢字等字符是二進制數轉換之後的結果。 通俗的說,按照何種規則將字符存儲在計算機中,如'a'用什麼表示,稱爲"編碼"; 反之,將存儲在計算機中的二進制數解析顯示出來,稱爲"解碼",如同密碼學中的加密和解密。 在解碼過程中,如果使用了錯誤的解碼規則,則導致'a'解析成'b'或者亂碼。

二. 字符集與字符編碼

字符是各種文字和符號的總稱,包括各個國家文字、標點符號、圖形符號、數字等。字符集是多個字符的集合, 字符集種類較多,每個字符集包含的字符個數不同,常見字符集有:ASCII字符集、ISO 8859字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。

使用哪些字符。也就是說哪些漢字,字母和符號會被收入標準中。所包含“字符”的集合就叫做“字符集”。 規定每個“字符”分別用一個字節還是多個字節存儲,用哪些字節來存儲,這個規定就叫做“編碼”。

各個國家和地區在制定編碼標準的時候,“字符的集合”和“編碼”一般都是同時制定的。 因此,平常我們所說的“字符集”,比如:GB2312, GBK, JIS 等,除了有“字符的集合”這層含義外,同時也包含了“編碼”的含義。


ASCII(American Standard Code for Information Interchange,美國標準信息交換代碼) 
單字節,能表示256個字符.但只使用了127個.最前面一位統一爲0.
0x00-0x20表示控制0x21-0x7F表示字符。


將ASCII中的第八位也用上,那麼就是8位的字符編碼了
將EASCII中0xA0-0xFF這部分比ASCII碼擴充出來的編碼, 用來表示表格符號、計算符號、希臘字母和特殊的拉丁符號。

利用了ASCII的7位編碼所沒有用到的第8位,這樣就編碼範圍就 從原先ASCII的0x00-0x7F多擴展出了0x80-0xFF,其中的0xA0-0xFF部分,被ISO/IEC 8859編碼所用到。
ISO/IEC 8859是一組編碼規則的總稱,其下包含了共15個字符集,即ISO/IEC 8859-n,其中n=1,...,11,13,...,16
這15個字符集,每一個字符集,編碼取值都是0xA0-0xFF,但是對於同一個值,不同字符集所對應的字符,都不太一樣。

ISO/IEC 6429是專門定義對應的控制字符的,其中,0x0-0x1F部分稱爲C0控制(C0 control )字符,0x80-0x9F部分稱爲C1控制(C1 control)字符。 對應的C0 control部分,和ASCII編碼重複定義了,但是兩者含義都是一樣的,所以編碼規則並不衝突。 可以算是,在控制字符領域,ISO/IEC 6429在ASCII的C0 control的基礎上,對於由ASCII的7位所擴展出的8位編碼中的0x80-0x9F這部分,也做出了對應的定義。
注意:
ISO 8859和ISO-8859,不是同一個東西。
因此,ISO-8859-n所以可以表示:
ISO-8859 = ISO-8859-n的簡稱 = ISO 8859-n + ASCII + ISO/IEC 6429
ISO-8859-1 = ISO 8859-1 + ASCII + ISO/IEC 6429 = ISO/IEC 8859-1 + ASCII + ISO/IEC 6429

Unicode是一個字符集,它包含了世界所有的字符,但它只規定了字符的二進制代碼。
UCS是Unicode的一個簡稱,早期Unicode都是用2個字節16位來表示字符.
但只能表示65536個字符,但後來隨着字符的增多,用4個字節32位表示(其實只有31位,最左邊一位爲0)
因此有了2個標準USC-2,USC-4.字面意思很清楚,4個字節向下兼容2個字節.

Unicode的實現有3個UTF-8,UTF-16,UTF-32.其中UTF-16就是我們所說的Unicode編碼.也就是USC-2的實現
對於Unicode也就是UTF-16編碼來說,例如'嚴'的漢字編碼是4E25,如果在存儲的時候是按照4E25的順序存儲, 那也就是大頭(Big endian)的方式,Unicode碼還有小頭(Little endian)的方式,按照254E的方式存儲. Unicode編碼是小頭方式.

因此使用Unicode的編碼需要區分大頭和小頭,Unicode規範中推薦的標記字節順序的方法是BOM.(只在Unicode特有)
在UCS編碼中有一個叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的編碼是FEFF。而FFFE在UCS中是不存在的字符,所以不應該出現在實際傳輸中。 UCS規範建議我們在傳輸字節流前,先傳輸字符"ZERO WIDTH NO-BREAK SPACE"。

這樣如果接收者收到FEFF,就表明這個字節流是Big-Endian的; 如果收到FFFE,就表明這個字節流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被稱作BOM。 UTF-8不需要BOM來表明字節順序,但可以用BOM來表明編碼方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8編碼是EF BB BF.

原創摘自:http://beadlechen.github.io/content/blog.html#category=software#article=encode

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章