刨根究底字元編碼之三——字元編碼的由來

字元編碼的由來

一、為什麼需要對字元進行編碼

1.

計算機一開始發明出來時是用來解決數字計算問題的,後來人們發現,計算機還可以做更多的事,例如文本處理。

但計算機其實挺笨的,它只「認識」010110111000…這樣由0和1兩個數字組成的二進位數字,這是因為計算機的底層硬體實現就是用電路的開和閉兩種狀態來表示0和1兩個數字的。因此,計算機只可以直接存儲和處理二進位數字。

2.

為了在計算機上也能表示、存儲和處理像文字、符號等等之類的字元,就必須將這些字元轉換成二進位數字。

當然,肯定不是我們想怎麼轉換就怎麼轉換,否則就會造成同一段二進位數字在不同計算機上顯示出來的字元不一樣的情況,因此必須得定一個統一的、標準的轉換規則。

二、EBCDIC碼與ASCII碼

1.

於是最開始出現了EBCDIC(Extended Binary Coded Decimal Interchange Code擴展二進位編碼的十進位交換碼)編碼標準。EBCDIC碼是由國際商用機器公司(IBM)為大型機操作系統而開發設計的,於1964年推出。

在EBCDIC碼中,英文字母不是連續排列的,中間出現多次斷續,這帶來了一些困擾和麻煩。

因此,在後來IBM的個人計算機和工作站操作系統中並沒有採用EBCDIC碼,而是採用了晚於EBCDIC碼推出、且後來成為了英文字元編碼工業標準的ASCII編碼方案。

2.

ASCII碼(American Standard Code for Information Interchange美國信息交換標準碼),由美國國家標準學會ANSI(American National Standard Institute)於1968年正式制定。

之後,又於1972年被ISO/IEC採用,制定為ISO/IEC 646標準(ISO,即國際標準化組織International Standardization Organization,成立於1946年;IEC,即國際電工技術委員會International Electrotechnical Commission,成立於1906年;ISO/IEC往往用來表示由這兩大國際組織聯合制定的標準)。

由於ASCII碼要晚於EBCDIC碼出現(網上也有文章說是ASCII碼要早於EBCDIC碼開始設計,但1968年ASCII碼才正式確定為標準),ASCII碼的編碼方式參照了EBCDIC碼,並吸取了其經驗教訓,將英文字母進行了連續排列,這方便了程序處理。

3.

ASCII編碼方案雖然不是最早出現的字元編碼方案,但卻是最基礎、最重要、應用最廣泛的字元編碼方案。

目前所通行的其他字元編碼方案,比如ISO-8859、GB系列(GB2312、GBK、GB18030、GB13000)、Big5、Unicode等等,均直接或間接兼容ASCII碼。

而像EBCDIC這樣與ASCII完全不兼容的編碼方案,基本上處於已淘汰或將要淘汰的境地。

三、ASCII字元編碼方案介紹

1.

ASCII碼使用七個二進位數字(bit比特、位)來表示一個字元,總共表示128個字元(2^7 = 128,二進位編碼為0000 0000 ~ 0111 1111,對應的十進位就是0~127)。

由於個人計算機普遍採用8位一個位元組來進行存取與處理,因此剩下最高位的那1比特一般為0,但有時也被用作一些通訊系統的奇偶校驗位。

2.

ASCII字符集共計有128個字元(見上表),碼點編號(即字元編號)從0到127(二進位為從0000 0000到0111 1111,十六進位為從0x00到0x7F),二進位最高位都是0。其中:

1)0~31:控制字元或通訊專用字元(不可顯示不可列印字元),如0x07(BEL響鈴)會讓計算機發出嗶的一聲、0x00(NUL空,注意不是空格)通常用於指示字元串的結束、0x0D(CR回車)和0x0A(LF換行)用於指示印表機的列印針頭退到行首(即回車)並移到下一行(即換行)等。

2)32~126:可顯示可列印字元(其中32為可顯示但不可列印的空格字元),48~57為0-9的阿拉伯數字,65~90為26個大寫英文字母,97~122為26個小寫英文字母,其餘的是一些標點符號、運算符號等。

3)127:控制字元DEL。

3.

這時候的字元編解碼非常簡單,比如若要將字元序列編碼為二進位流寫入存儲設備,只需要將該字元序列里的各個字元在ASCII字符集中的字元編號(即碼點編號),直接以一個二進位位元組寫入存儲設備即可,字元編號就是字元編碼,中間不需要經過特別的編碼演算法進行字元編號到字元編碼的轉換計算,更不存在所謂碼元序列到位元組序列的轉換。

上一篇:刨根究底字元編碼之二--關鍵術語解釋(下) - 知乎專欄

下一篇:刨根究底字元編碼之四--EASCII及ISO 8859字元編碼方案 - 知乎專欄


推薦閱讀:

為什麼編碼(GBK、Big-5 等)問題這種歷史遺留始終得不到解決?
用python模擬登錄知乎,爬回來的是亂碼?
Python2.7 中文字元編碼,使用Unicode時,選擇什麼編碼格式?
是不是&為什麼不像言和訁(訁)那樣把車單獨列為車字旁?
每一個Unicode里編碼的諺文(韓文)字元都曾在歷史上使用過嗎?

TAG:字符编码 | 字符集 | Unicode统一码 |