字碼表
首先先解釋字碼表是什麼東西。寫過程式的人都知道大部份電腦語言有兩種基本變數,即整數 ( 各種長度與有號無號 ) 與浮點數 ( 同樣也有不同長度 ) ,有些新人會說還有字元啊、邏輯值啊!但其實這些都被歸類為整數。探討邏輯值的部份就脫離主題了,因此我們只研究關於字元的部份。
一串文字其實就是很多字母 ( 字元 ) 所排列起來的,因此所有的文字表現都要追逤字元這件事。但其實電腦根本就看不懂字,雖然我們看到的東西是文字,然而所有的字在電腦裡都是數字。電腦處理數字、儲存數字、分析數字、傳送數字,這也就是為什麼很多程式語言的「字元」可以被拿來做加減乘除運算的原因,比方說 ASCII 的「 A 」減 1 會變成「 @ 」。事實上「 A 」就是數字 65 ,而數字 64 就是「 @ 」。因為他們本來就是數字,只有在最後要把字顯示在螢幕上或是從印表機印出的時候才會被轉換成對應的圖形。這裡就說到一個關鍵的地方,最後一關電腦要知道什麼數字應該轉換成什麼圖形 ( 文字 ) 來顯示,於是電腦內部就會有一張表格,記載著幾號數字對應到什麼東西,這就是我們所稱呼的「字碼表」。
在電腦剛開始發展的那個古老年代,每台電腦都有自己不同的字碼表,也就是說相同的字母在不同電腦裡的號碼是不同的,因此電腦之間的資訊交換極為困難。不過說實在的,那時候的電腦之間彼此並不會交換數位資料。在網際網路與商用電腦興起之前的電腦流行的是紙本報表文件,各臺電腦只要能管好自己就很好了,因此那時的人可能根本就沒想到這個問題。
位元組
數位電腦內部就是一堆的數位資料在處理、運算,這些數位資料也就是一堆位元 0 與 1 的組合,這個大家都知道。但是電腦一次一個位元的處理資料太沒有效率了,因此實際的電腦一次會處理一把資料,而這個一把資料就是一組位元,也就被稱為「位元組」。位元組是一臺電腦一次所能處理的資料數量下限,也就是除非經過一些資料分離與合併手段,否則電腦不能處理少於一個位元組的資料。
在那個古老的時代,一個位元組通常有六個位元 ( 和現在的八個位元不太一樣 ) ,每個位元有 0 與 1 兩種變化, 6 個位元就有 64 種變化。對於文字來說, 26 個英文字母 ( 不含小寫 ) 、 10 個阿拉伯數字、再加上空白字元、一些標點符號和控制字元,一個字元佔用一個位元組的資料是剛好還有餘。回想一下在那個古老的年代電腦都在幹什麼?不外乎就是計算航空太空、核子武器等等應用,對於文字方面沒有太多要求,這樣是很夠用了!
商用電腦催生新的需求
1950 年代商用電腦的興起催生了數位電腦的新一波發展,人們對於電腦的需求不再止於數學計算。尤其是圖書館的書目檢索系統應用上,傳統的六位元字碼表不能符合其需求,加上數位資料交換、傳輸的需求,傳統各行其事的字碼表系統更顯得凌亂不堪。此時的數位電腦產業極需要一個能夠應付一般用途的、統一的字碼表,美國國家標準協會 (ANSI) 隨後制定出了舉世聞名的 ASCII 字碼表。
ASCII
ASCII 字碼表中每個字元所佔用的空間由 6 位元擴充為 7 位元,因此可以容納大小寫字母以及更多的符號。
原來 ASCII 僅為美國國家表準,但因為美國主導了數位電腦的發展數十年,以至其漸漸成為國際間所默認的標準 (1991 年正式被收納為國際標準 ) ,直到近代 Unicode 興起仍不能忽視 ASCII 的影響力。對數位電腦發展應用如此重要的字碼表值得花一些篇幅來做介紹,首先先看一下 ASCII 字碼表的內容:
表 1 : ASCII 字碼表 [11]
ASCII 字碼表分為兩大部份,為「控制字元」和「可顯示字元」。可顯示字元的部份前面說了很多就不再贅述,而控制字元的部份比較特別,它掌管諸如格式定位、換行、資料傳輸等與「格式」或「動作」相關的控制。關於控制字元的部份其實有很多是歷史遺留的東西,實際上現在已少見其應用,這裡只把幾個常見的控制字元拿來說明:
00 ( 十六進位 ) 號為空,就是什麼都沒有的意思,在一些字串分析程式裡面,這個符號用來標示一個字串的結束;而 09 號是水平格式定位符,也就是與 Tab 鍵一樣的作用; 07 號為響鈴,其實沒什麼實際的應用,只是這個號碼很好玩。有寫程式的朋友可以試著把數字 7 當成字元對螢幕輸出,通常沒有意外的話電腦主機上的喇叭會逼一聲。
0A 和 0D 都是與換行有關的符號,這個東西比較討厭。這要追逤到古代的機械打字機,通常一行打完要換行時會有兩個動作:把紙往上捲一行、以及把打字頭歸位到最左邊。這兩個動作對數位電腦其實沒有意義,只要留一個就可以了,因此在 Apple 系列電腦上採用 0D 做為換行符號、 Linux ( 及 UNIX) 系統採用 0A 做為換行符號,而 Windows ( 及 DOS) 不知何固承襲了 0D 加 0A 做為換行符號 ( 順序還不能調換 ) 。因此在 A 系統上使用以 B 系統換行格式寫成的文字檔案時便常發生換行格式不正確的問題,平常最常見的案例大概就是使用 Windows 的記事本開啟 Linux 格式文字檔的時候。類似這樣討人厭的換行問題直到現在仍然廣泛的存在著,連 Unicode 都沒有辦法統一這個符號。
ASCII 在當時的應用
由於 ASCII 字元需佔用 7 個位元,因此當時 ASCII 僅用作資料交換時使用的統一格式,各電腦內部仍使用自己的 6 位元字碼表,在資料傳輸時才將之轉換為 ASCII 碼。值得一提的另一件事為當時由於資料傳輸時的不確定因素可能造成資料錯誤,硬體設備廠商通常都會再加上一個位元做為查驗使用,因此資料在實際傳輸時為 8 個位元一組。
隨著半導體記憶體被發明並取代傳統的磁芯記憶體,電腦記憶體的成本大幅降低,從此電腦硬體廠不再吝惜於使用 6 位元的架構。此時一個位元組被擴展為 8 位元,許多電腦內部更直接使用 ASCII 做為字碼表,至此大致底定 ASCII 在數位電腦的地位,以及 8 位元組成一個位元組的通例。
EBCDIC
其實一直以來有一個字碼表系統常常被人遺忘,就是由 IBM 在 1963 年所發展的 EBCDIC 字碼表系統。然而這個字碼表系統後來不敵 ASCII 而漸漸沒落,現在連相關資訊都很難找。我在寫這篇文章時便苦於找不到 EBCDIC 足夠的資訊,並且相關資料的時代還兜不隴,因此沒有特別講述這個字碼表,只在這裡大略提起這種字碼表的存在。
參考資料:
-
大五碼、倚天中文 – 小木偶的網頁
-
國內中文字碼之發展 – 交大資科BBS
-
王安電腦的興衰 – Jserv's blog
-
中文標準交換碼全字庫
-
淺釋Unicode – novus
http://novus.pixnet.net/blog/post/30371481-%E6%B7%BA%E9%87%8B-unicode
-
談程式碼使用的字集 – novus
-
每個軟體開發者都絕對一定要會的Unicode及字元集必備知識 – 周思博
-
Unicode是用幾個位元來進行編碼? – LSS實驗室Beta
-
非常經典的UTF-8 – Gea-Suan Lin's BLOG
http://blog.gslin.org/archives/2013/10/01/3670/%E9%9D%9E%E5%B8%B8%E7%B6%93%E5%85%B8%E7%9A%84-utf-8/
-
UTF-8 Everywhere
-
認識中文字元碼 – 中研院計算中心 曾士熊
-
Wikipedia
http://zh.wikipedia.org/wiki/%E5%A4%A7%E4%BA%94%E7%A2%BC
http://zh.wikipedia.org/wiki/Unicode
http://zh.wikipedia.org/wiki/UTF-32
http://zh.wikipedia.org/wiki/UTF-16
留言列表