Unicode誕生
從1980年代開始,人們漸漸受到世界各地混亂的編碼系統所苦,一個有效的解決方法便是重新制定一個全新的、廣納各國各語各文字的大型編碼系統,然後用力推廣它,用它來取代與統一各國各行其事的字碼表系統。
於是有兩個組織不約而同的召集各國代表與電腦相關產業廠商,開始進行了這樣的工作,一個是「Unicode組織」,一個是「國際標準組織(ISO)」。後來這兩個組織一致體認到向全世界提供兩個互不相容又不統一的「統一字碼」系統對數位資訊發展並沒有幫助,於是兩組織開始互相合併工作成果,並互相兼容彼此的標準(還好這兩個組織的成員都認為自己背負了歷史的責任,不然當今就要有兩套互不相容的Unicode了)。由於Unicode統一各種編碼並囊括所有文字,因此又被稱為「統一碼」或「萬國碼」。到了1991年10月,第一個版本的Unicode標準終於被公諸於世。
Unicode結構
Unicode所定義的字碼編號(十六進位)從0到10FFFF總共一百多萬(1114112)個碼位,被戲稱連克林貢語都可以被收納在內。這一百多萬碼位又被切割成等量的17個區塊,這些區塊通常被稱呼為「平面」,每一個平面的用途請見下表所示:
平面 |
字碼範圍 |
名稱 |
---|---|---|
0號平面 |
0000 ~ FFFF |
基本多文種平面 |
1號平面 |
10000 ~ 1FFFF |
多文種補充平面 |
2號平面 |
20000 ~ 2FFFF |
表意文字補充平面 |
3號平面 |
30000 ~ 3FFFF |
表意文字第三平面(未正式使用) |
4號平面 |
40000 ~ DFFFF |
(尚未使用) |
14號平面 |
E0000 ~ EFFFF |
特別用途補充平面 |
15號平面 |
F0000 ~ FFFFF |
保留作為私人使用區(A區) |
16號平面 |
100000 ~ 10FFFF |
保留作為私人使用區(B區) |
表3:Unicode平面分佈[14]
Unicode中的第0號平面是使用頻率最高的平面,被稱為「基本多文種平面」,而其他的平面使用率較低,就統稱為「輔助平面」。由於基本多文種平面最常被使用,下面再來看一下這個平面內的字碼分佈圖:
圖2:Unicode基本多文種平面字碼分佈[14]
(註:每一個格子代表256個碼位,例如34這一格代表從3400到34FF的碼位)
這兩張圖表其實大略看過就好,幾個比較值得注意的地方在這裡說明:
-
這個平面包含了幾乎所有語言的常用文字。
-
碼位0到7F這個範圍與原來的ASCII完全相同。
-
碼位D800到DFFF的範圍沒有任何的字碼對應,這個範圍被保留給代理對使用,關於代理對的部份將在後面說明。
-
FEFF這個號碼很特別,他被定義為一個特殊的空白字元,這個字元沒有寬度,不會在顯示上造成任何影響,原文稱它為:A zero-width no-break space。簡單的說就是它沒有任何的效果,它的主要作用是用來標示編碼的位元組順序(後面提到)。
Unicode字元佔用幾個位元組?
當被問到一個Unicode字元需要佔用幾個位元組這種問題時,那些長期被Windows洗腦的程式人員通常會不假思索的回答:兩個位元組。然而看看Unicode的碼位最高達到10FFFF的數字就知道不可能在兩個位元組的空間(最高碼位為FFFF)放得下這種數字。那麼究竟一個Unicode字元佔用多少位元組呢?常見一個Unicode字元佔用兩個位元組的誤解又是怎麼來的?關於這些問題請再慢慢觀看下面的說明。
其實對於一個Unicode字元究竟佔用多少位元組這個問題的解答是:不一定,這會隨著使用的編碼方式不同而有差異。也許你會問:那麼前面不是才說了Unicode是個「統一」的字碼系統嗎?這裡說的編碼差異又是怎麼回事呢?事實上Unicode的標準只有管幾號碼對應什麼字這件事,至於這些字碼該如何組成資料、如何記錄於記憶體等儲存媒體中的事情一概不管。但是大家也不要太責怪這些標準委員們,他們光是能解決字碼收錄、合併統一、以及排序等等的問題就已經功德無量了,至於其他的事情就交給其他的人來吧!
參考資料:
-
大五碼、倚天中文 – 小木偶的網頁
-
國內中文字碼之發展 – 交大資科BBS
-
王安電腦的興衰 – Jserv's blog
-
「許功蓋」的問題 – 網管很忙
http://203.64.20.7/lifetype126/index.php?op=ViewArticle&articleId=15&blogId=1
-
中文標準交換碼全字庫
-
Unicode編碼表
-
淺釋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/%E8%BC%94%E5%8A%A9%E5%B9%B3%E9%9D%A2
http://zh.wikipedia.org/wiki/UTF-32
http://zh.wikipedia.org/wiki/UTF-16