一個在台灣地區絕大部分使用電腦的人口中,延用了近二十年的編碼系統,居然一直都沒有官方公定的標準,講起來實在是有些不可思議。要了解箇中緣由,故事得從頭說起 ....
最初的 Big5 碼,是在 1984 年,由台北市電腦公會主導,聯合十多家電腦業者共同制定的。當初制定的目的是為了因應電腦相關業者對「中文數位化」日益迫切的需求,有了統一的中文編碼標 準,則中文數位資料才能在各平台間交換,各廠商也才能進而開發相關的中文處理軟體。雖然在此之前,曾有一批文字學家、圖書館學家、以及電腦學者等所組成的 「國字整理小組」,進行國字整理與編碼工作,並制定了目前通行於圖書館界的 CCCII 碼,然而可惜的是此套編碼不被當時的政府單位採納,因而無法在電腦業界推廣。是故他們才有另起爐灶,制定 Big5 碼之舉。而我們為了便於區分起見,便稱這個最初的 Big5 碼版本為: BIG5_1984。
根據 Big5 碼的編碼規則,其所能容納的中文字與符號,最多也只有將近兩萬個,但中文字的個數實際上遠遠超過這個數目,要全部囊括進來是不可能的。因此在制定之初便保 留了適當的彈性,也就是在此編碼範圍中只收錄了一般常用字與次常用字,並保留了相當的碼點空間讓使用者造字,藉此彌補缺字的問題。
然而,當初的美意卻造成了往後的問題。由於保留了廣大的造字空間於此編碼中,再加上政府單位向來不硬性規定中文編碼的態度,於是各廠商紛紛在這些造字區中 加料,因此 Big5 碼版本紛岐的問題就來了。在這諸多 Big5 的「變種」版本中,最重要的兩個莫過於來自「倚天中文系統」的「倚天外字集」[6] (我們稱之為: BIG5_Eten),以及來自微軟視窗系統的 CP950 字集了。它們之所以重要主要是因為使用者眾多,流傳極廣。僅管它們在原本 BIG5_1984 已有漢字與符號定義的碼點部分是相同的,但在原為 BIG5_1984 的造字區卻有若干不同,不幸的是這些出現在造字區的新符號已有不少使用者在使用,因此當他們在換用不同的中文系統時,就不時會出現原本可以用的文字符號這 回卻不能用的困擾了。
這樣的問題到了自由軟體世界開始邁向中文化時更行嚴重。因為絕大部分的自由軟體的開發是集世界各地的程式開發者一同加入的,大家所考慮的是「程式國際化、 資料本土化」的程式設計架構,也就是一套程式設計出來能同時處理多國語文,而處理各國語文的部分與程式本身分開,自成一個資料庫,如此寫程式時就不需要為 了每一種語文而各寫一個版本了。
這是一個很好的架構,但當他們開始實作我們的 Big5 碼的部分時卻遇上了麻煩,因為他們找不到一個有公信力的標準可以參考,同時也不了解我們這邊的情況。他們唯一找得到的參考對象,是一份來自 Unicode Consortium [7] 的 Big5 與 Unicode 之間的轉碼表 [8],偏偏這份轉碼表的內容,不知為什麼,與 BIG5_1984, BIG5_Eten, 及 CP950 間又有些許差異,少了很多 BIG5_Eten 中已廣為使用的倚天外字。因此,這也就造成了在自由軟體世界剛邁入中文化的頭一兩年裡,最讓大家感到困擾的地方了。
到此,Big5 碼的變種故事還沒完全結束,而之後所出現的變種,已不單只是將原來的 BIG5_1984 的造字區拿來放入若干符號而已,事實上,它們更是大幅收錄新字,填入造字區中空出來的碼點上,故嚴格說來它們已是「新」的字集了。在這之中,最重要的莫過 於「BIG5 香港增補字符集」(Hong Kong Supplementary Character Set ---- BIG5-HKSCS [9]) 了。這是由香港政府所制定的,而且也已成為香港地區通行的標準。而在我們這邊,中推會也曾制定了一份「BIG5 補充碼字集」(BIG-5 Extension Character Set ---- BIG-5E [10]),當初制定的動機提供一份現成的常用造字字集,讓使用者可以免除大量造字的麻煩,同時也方便使用新字的文件在各平台間交換。然而,它並沒有成功 地推廣開來。
正因為 Big5 有這麼多彼此分岐的版本,不論在實作上或使用上都給大家帶來了麻煩,因此在我們的中文環境要邁向國際化之際,就必須開始嚴肅看待這個問題了。這些種種的問 題,終於在去年 (2002 年) 8 月 3 日,在中研院資科所舉辦的 Li18nux 台灣特別會議中被提出來討論了。與會者均同意,由於 Big5 碼的編碼空間有限,再怎麼樣也難以收錄所有中文字,同時版本不一,故缺字的問題很常見,最直接的解決之道就是換用大字碼 (如 CNS11643 [11] 或 Unicode [7]),但那可能需要相當的社會成本,不是一天兩天可以辦得到的事,必竟現在我們有太多的電腦文件資料是使用 Big5 碼了。故邁向大字碼將會是一個漸進的工作,這也意味著我們可能還有好一段時間需要依賴 Big5 碼。既然如此,我們應該要給它確立好一個標準,並且在自由軟體世界中有完善的實作,讓大家在使用上不再發生困擾。
於是,在 Li18nux 會議中,針對此議題我們做出了結論: 在 Li18nux 組織 (現已改稱 OpenI18N [12]) 中成立一個 Li18nux-big5 的工作小組 (同樣,現已改稱OpenI18N-big5),進行初期的 Big5 碼標準化的規畫工作。當時我們的工作重點主要有兩項:
1. 重新檢示 Big5 碼,並確立其與 Unicode 間的對應。當時我們主要是拿最廣為使用的 BIG5_Eten 與 CP950 為範本,取其聯集,同時參考 BIG5_HKSCS 與 Unicode 的對應表,盡量做到最大的相容性。這主要的工作是由唐宗漢兄 (Autrijus Tang) 與霍東靈兄 (Anthony Fok) 完成,我們將它定名為 TW-BIG5 編碼 [13],以符合 OpenI18N 對字集編碼名稱的規範 [14]。
2. 推動 Big5 碼國家標準化,期望政府相關單位能正視,並參與維護 Big5 碼。這部分主要是由葉平兄 (Ping Yeh) 在進行。
其中第二部分,在葉平兄積極奔走,以及行政院主計處 [11] 與軟體自由協會 [15]的協助之下,一步步地往前推進。然而,要成為「國家標準」一事可沒有想像中那麼簡單,首先必須經由標檢局的審核,經認可確實「有必要」標準化之 後,再委請相關執行單位 (如中推會) 制定標準草案,最後再回標檢局審核確立。然而,這中間另外有一項波折。
由於政府單位一貫的態度,總是認為一般使用者所用的「中文編碼系統」不應硬性規定成國家標準,而是保留給電腦業者自行開發實作;而真正可以確立為國家標準 的,唯有「中文標準交換碼」 CNS11643。因此,若說要另外制定一個可以與 CNS11643 平起平坐的中文編碼標準是不可能的。唯一可行的途徑就是將 Big5 碼以附錄的形式,收錄 於 CNS11643 之中。於是,中推會於今年下半年度起接受委託,開始了相關的作業。在歷經幾次會議之後,終於有了一份「BIG5-2003」的草案。
而這個也就是那封出現於 slat-talk 郵遞列表的信的由來。
二、各種 Big5 碼編碼差異:
談完了 Big5 碼曲折的歷史,以下我們來看看各種 Big5 碼編碼的差異。
由於中文字的數量動輒上萬,因此在電腦中不能像西方國家一樣,單單只用一個位元組 (byte) 來容納。故在 Big5 的編碼中,是以兩個位元組來代表一個中文字或符號,傳統上在螢幕顯示時其寬度是兩個英文字 (ASCII 碼) 的寬度,故在許多中文系統中,我們習慣將這些中文符號稱為「全形字」,而相對的 ASCII 字則稱為「半形字」。儘管我們 用兩個位元組組成全形字,但為了能與 ASCII 碼相容 (這裡指的是,同一份文件中可以中 [BIG5 全形字]、英 ASCII 半形字] 夾雜,而不會造成混餚),我們不能將這兩個位元組的所有可能值都納入編碼範圍。故在 BIG5 編碼中其規則如下:
第一位元組: 0x81 - 0xFE
第二位元組: 0x40 - 0x7E 以及 0xA1-0xFE
總共內含 19782 個碼點。因此,傳統上當程式在處理內含 BIG5 以及 ASCII 的字串時,它必須從頭讀起,如果發現字串中某一位元組與其下一個位元組同時落在上述的編碼範圍時,則將這兩個位元組合起來標定為一個 BIG5 全形字,否則則將它們視為兩個半形 ASCII 字。
在這將近兩萬個碼點中,並非所有的碼點都有定義中文字或符號。事實上,在原來的 BIG5_1984 中,有定義的碼點其第一位元組的區間是在 0xA1 - 0xF9,而之前與之後,以及中間空出來的的碼點都規劃為造字區。
在下表中,我們比較了幾種重要的 Big5 版本,其中包括了原始的 BIG5_1984、後來廣為流傳的 BIG5_Eten 和 CP950、以及之後我們所定訂的 TW-BIG5 草案:
第一位元組 第二位元組 字區 BIG5_1984 BIG5_Eten CP950 TW-BIG5
------------------------------------------------------------------------------- A1..A2 40..7E, A1..FE 各種符號區 y y y y
A3 40..7E, A1..BF 各種符號區 y y y y
A3 E1 歐元符號 - - y y
A4..C5 40..7E, A1..FE 常用字區 y y y y
C6 40..7E 常用字區 y y y y
C6 A1..FE 罕用符號區 - y - y
C7 40..7E, A1..FE 罕用符號區 - y - y
C8 40..7E, A1..D3 罕用符號區 - y - y
(數字符號、日文、俄文、輸入法特殊符號)
C9..F8 40..7E, A1..FE 次常用字區 y y y y
F9 40..7E, A1..D5 次常用字區 y y y y
F9 D6..FE 七個擴充字、 - y y y
表格符號區
------------------------------------------------------------------------------- (表一: BIG5_1984, BIG5_Eten, CP950, 與 TW-BIG5 所使用的編碼範圍比較)
由上表可知,在 BIG5_1984 中,所使用到的編碼範圍大至上可以分成三個區塊,包括第一塊的「各種符號區」共 408 的符號 (其中包含標點符號、注音符號、全形英文與羅馬字母、及各種單位符號等)、第二塊的「常用字區」共 5401 個字、以及最後的「次常用字區」共 7652 個字。而 BIG5_Eten 與 CP950 在這三個區塊的定義都與 BIG5_1984 相同,所不同的是它們分別在這三個區塊中間的空碼點上填入了若干符號,而這些符號中尤以 0xF9D6 - 0xF9FE (七個擴充字與表格符號區) 以及0xC6A1 - 0xC7F2 (罕用符號區中的數字符號與日文字母) 使用廣泛,故也特別重要。舉個例子,下表所列就是所謂新添加的七個擴充字:
擴充字 BIG5 碼 Unicode 碼 BIG5_1984 的替代字
------------------------------------------------------------------ 碁 0xF9D6 0x88CF 棋
銹 0xF9D7 0x92B9 鏽
裏 0xF9D8 0x7CA7 裡
墻 0xF9D9 0x58BB 牆
恒 0xF9DA 0x6052 恆
粧 0xF9DB 0x7881 妝
嫺 0xF9DC 0x5AFA 嫻
------------------------------------------------------------------ (表二: BIG5_Eten, CP950 收錄的七個擴充字)
各位是不是覺得,當中有些字相當常用呢?
為了達到最大的相容性,故當時我們在制定 TW-BIG5 草稿時,便取了上述各 Big5 碼版本的聯集,詳見表一。但光是這樣還不夠,還有一項重要的工作是確立各 TW-BIG5 碼點與 Unicode 之間的對應關係。因為在自由軟體世界 (在此尤其指的是 GNU/Linux 系統) 的「程式國際化、資料本土化」的程式架構下,各國語文資料在系統底層都必須以 Unicdoe 或 UCS4 編碼來表示,如此才能達到編碼轉換與資料交換的目的。因此我們不僅要將 TW-BIG5 中有定義的碼點與 Unicode 對應起來,我們還要考慮空的碼點,也就是造字區的部分與 Unicode 的對應,否則的話過去若有使用者造字,則這些造出來的字就永遠無法在 TW-BIG5 下使用了。僅管純就技術與實務的觀點出發,我們不鼓勵使用者自行造字,但為了做到最大的相容度,我們還是納入了造字區與 Unicode 間的對應,這其中包括了:
TW-BIG5 (UDA) Unicode (PUA)
------------------------------------- 0xFA40 - 0xFEFE U+E000 - U+E310
0x8E40 - 0xA0FE U+E311 - U+EEB7
0x8140 - 0x8DFE U+EEB8 - U+F6B0
------------------------------------- (表三: TW-BIG5 User Defined Area (UDA, 使用者造字區) 與 Unicode Private Use Area (PUA, 私人使用碼點區) 之間的對應)
由於這些造字區的碼點沒有真正定義中文字或符號,因此在與 Unicode 對應時必須對應到其 PUA 的區域。這個區域是私人使用的碼點區,也沒有明確的文字或符號定義,同時在 Unicode 的規範中,使用 PUA 區的碼點資料是不能用來交換的,道理很簡單,正如同某甲所造的新字不見得能在某乙的電腦中同一個碼點位置上找到。
最後,當中推會匯整電腦業界的意見,進而整理出 BIG5-2003 草案時,我們這邊的首要工作,便是比對 BIG5-2003 與 TW-BIG5 之間的異同,並且提出我們的意見。
由於推動 Big5 碼國家標準化的工作,我們 -- 即自由軟體社群 -- 也是推手之一,理論上在 BIG5-2003 草案提出時,就應當考慮到我們的意見,也就是 TW-BIG5 的內容。然而,由於之前聯繫上的失誤,使得我們的 TW-BIG5 沒有即時被納入考慮,因此事後的比對工作就相形重要了。經過比對之後,我們發現 BIG5-2003 與 TW-BIG5 之間還是有些差異的 [16],這些差異總結如下:
1. BIG5-2003 沒有考慮到使用者造字區與 Unicode PUA 之間的對應。
2. BIG5-2003 在「罕用符號區」中,將 BIG5_Eten 與 TW-BIG5 內含的俄文字與輸入法特殊符號都刪除了,僅保留了數字符號以及日文字。這麼做我猜測是基於兩點理由:
a. 因為 BIG5-2003 的定位是要做為 CNS11643 的附錄,這也意味著每個 BIG5-2003 上有定義的碼點都要與 CNS11643 有一對一對應才行。然而這些罕用符號區中的俄文字與輸入法特殊符號在 CNS11643 都找不到對應,因此自然不能包含進來。
b. 這些沒有包含進來的符號幾乎沒有人在使用。
3. 部分 BIG5-2003 和 TW-BIG5 的碼點與 Unicode 的對應不一至,這些碼點包括:
codepoint description TW-BIG5 BIG5-2003
-------------------------------------------------------- 0xA156 橫線 U+2013 U+2015
0xA1C2 橫線 U+00AF U+203E
0xA2A4 畫表格符號 U+2550 U+2501
0xA2A5 畫表格符號 U+255E U+251D
0xA2A6 畫表格符號 U+256A U+253F
0xA2A7 畫表格符號 U+2561 U+2525
0xA2CC 十 U+3038 U+5341
0xA2CD 卄 U+3039 U+5344
0xA2CE 卅 U+303A U+5345
0xC6D9 上點 U+02C6 U+FF3E
0xC6DE 兩撇 U+F6EE U+3003
0xC6DF 仝 U+F6EF U+4EDD
-------------------------------------------------------- (表四: TW-BIG5 與 BIG5-2003 在與 Unicode 對應時相異部分的比較,其中 第一欄是 TW-BIG5 與 BIG5-2003 的碼點,第二欄是這些碼點的簡單 說明,而第三與第四欄分別是二者對應到 Unicode 的碼點)
會造成這些差異,據推測主要的原因包括:
a. 這些差異的碼點多屬於符號,而 Unicode 中類似的符號不少,乍看之下這些符號似乎也沒多大差別,因此在對應時不易有明確的選擇。
b. 二者對某些符號的意義解釋不一,例如 0xA2CC, 0xA2CD, 與 0xA2CE 這三個,到底應把它們解釋成「數字符號」?還是真正的「中文字」?不同的解釋,其對應方式就不會一樣。
c. 當初我們在制定 TW-BIG5 時,有很大一部分是參考香港的 BIG5-HKSCS 的對應方式,其中一個目的是為了盡量做到二者間的相容,而其結果就可能造成與 BIG5-2003 的岐異。
針對這些不同點,我們在匯整自由軟體社群的意見之後,打算在下次 BIG5-2003 會議召開時,提出以下的意見進行討論 [17]
1. 針對 BIG5-2003 與 TW-BIG5 之間相異的部分提出我們的看法 (詳見 [16][17]),希望能在會中取得共識。
2. 一些 Big5 沒有收錄,但現今已是常用字,如 (吉吉)、(方方土)、(火宣)、(酉每) 等,希望可以一併收入 BIG5-2003 的造字區中,並且比照 BIG5-HKSCS 的碼點位置來安放這些新字,以便做到與 BIG5-HKSCS 相容。
三、未來的工作:
嚴格來說,解決 BIG5-2003 與 TW-BIG5 之間的差異,並將 BIG5-2003 推向國家標準化,只是第一步而已。如果我們再仔細看看 Big5 碼的內容,就會發現其中仍有些許不完善的地方,仍需進一步的工作。以下筆者就以個人的觀點,將這些需要進一步工作的部分提出,做為本文的結束。
1. 與 Unicode 之間的多對一的對應問題:
這裡指的是多個 Big5 碼點對應到同一個 Unicode 的碼點,之所以會有這樣的狀況主要是因為 Big5 中有些碼點所代表的符號相當形似,而在 Unicode 中對這些看起來形似的符號只提供單一碼點做為對應。這其實是 Big5 先天上的問題。這會造成某些 Big5 多對一的碼點在轉成 Unicode 之後再轉回 Big5 時就不見了,因為轉回來時是轉到另一個也同樣對應到該 Unicode 碼點的 Big5 碼點去了。這就等於說某些資訊可能在這樣的轉換中流失,故原則上我們希望這種「多對一」的情況可以越少越好。
2. 異體字問題:
我們曾發現,某些中文字,在 BIG5 與 CNS11643 中,與教育部所頒佈的標準楷書形狀不一樣 [18]。理論上,中文字的形狀應以教育部頒佈的為標準,然而由於 CNS11643 已是國家標準,同時其標準也早已提報到許多國際組織中,要改並不容易。異體字的問題直接關係到我們對下一代的教育,因此,筆者認為我們有必要正視此一問 題,設法化解將二者間的岐異。
3. 未來是否再擴充:
目前的 Big5 還有很大的造字空間,必要的話可以繼續收錄新字。但我們是否要這麼做?從實用的觀點出發,這麼做是必要的,因為隨著時代的演進,原本的罕用字可能漸漸變成 常用字,我們免不了要面臨缺字的問題。然而,繼續收錄新字讓 Big5 成長,也意味著原本的造字區將逐步縮水,原來慣用造字區的使用者將無法再使用它。另外,若要最直接地解決缺字問題,便是換用大字碼。當我們正一步步朝向大 字碼邁進之際,是否還值得持續擴充 Big5 ?這一點值得大家討論。
四、參考資料