《資訊話題》 Unicode與ISO10646(上)(作者:曾士熊) 一、緣起 1960年代初期,美國國會圖書館(Library of Congress, LC)的 Henriette Avram等人開始研擬機讀編目格式,同時James Agenboard 等人也制訂了英文的字元集和交換碼,以做為美國圖書館界書目交 換的共同標準。LC交換碼隨後發展成為美國的國家標準ASCII(American Standard Codefor Information Interchange),而且還進一步演 變成世界性的電腦字元編碼標準ISO646(其全名為7-bit coded character set for information interchange)。時至今日,雖然 一個位元組(byte)的長度已經從7個位元(bit)增加為8個位元, ASCII和ISO646 仍然是電腦與網路世界裡要的奠基標準。 依ASCII和ISO646的規定,7個位元所能提供的128個編碼位置(編 碼範圍為0∼127)被區分為兩部分:94個圖形字元碼和34個控制字 元碼。圖形字元包括52個大小寫英文字母、10個阿拉伯數字、9個標 點符號、6個括號,以及17個其它符號,編碼範圍從33到126。控制 字元則包括10個傳輸控制字元、6個版面調整字元、4個設備控制字 元、 4個資訊分隔字元和10個特殊控制字元,其編碼為0∼32和127。 當電腦或網路設備收到一連串的位元信號時,通常會一邊接收一邊 切分為位元組(即每8個位元一切),並且立刻分辨剛收到的位元 組究竟是控制字元碼還是圖形字元碼。若是屬收訊設備相關的控制 字元時(例如傳輸控制、編碼為7的BELL等字元),當電腦或網路 設備會截留該字元並立即做出對應動作(例如BELL字元會驅使收訊 設備叫一聲),否則不予處理而傳送給後續設備。換言之,電腦和 網路設備會吃掉位元串裡的特定控制字元碼。 隨著電腦功能的日趨強大與價格的日趨便宜,其應用領域也越來 越廣。但是隨之而來的各種編碼需求,卻使得單一位元組的編碼方 式,因編碼空間太小,變得不足以因應各種應用程式的需求。中文 字、排版系統的標誌符號、非英語拼音字母和圖形符號等的編碼, 需要使用2或多個位元組來編碼。同時,為了預防這些多位元組字元 碼被電腦或網路設備「吃掉」其中的某個位元組,編碼時必須避開 每個位元組的0∼32和127這34個控制碼。這種做法嚴重浪費編碼空 間,就多位元組擴充編碼的國際標準ISO2022而言,兩個8位元的位 元組只能提供最多188個控制字元和35,344個文字形符號的編碼空間, 共計35,532個編碼位置,但是16個位元的編碼空間事實上高達65,536。 兩者相比較,ISO2022的16位元編碼只能達到最大編碼空間的54%, 顯得利用率很差。同時在應用層次的編碼,由於廠商眾多又缺乏共 識,往往你編你的碼、我編我的碼,其後果則是引發萬碼奔騰的亂 象。 為容納全世界各種語言的字元和符號,ISO的一些會員國於1984年 發起制定新的國際字元集編碼標準。新標準由工作小組ISO/IEC JTC1/SC2/WG2(註1)負責擬訂(以下簡稱WG2),最後定案的標準 命名為“Universal Multiple-Octet Coded Character Set” (簡稱UCS),其編號則訂為ISO/IEC 10646。依WG2原來的規劃, ISO10646的編碼結構係沿襲ISO2022八位元延伸編碼結構以避開C0和 C1兩個控制碼區(註2),但打破每個字元碼裡的所有位元組的bit-8 (即最左邊的位元,其值為28=128)必須都設為0或是都設為1的限制, 以提高編碼空間的使用率。同時,為了能有足夠位置以容納全世界各 種語言的字元和符號,以及為了配合微處理器以8、16、32甚或64個 位元為一個運算處理單位的趨勢,ISO10646的字元碼長度被規定為 定長的4個八位元(octet)。 ISO10646草案初稿一經公佈,其編碼結構立即遭到美國部份電腦 業者的反對。1988年初,美國Xerox公司的Joe Becker倡議以新的編 碼結構,另外編訂世界性字元編碼標準:將電腦字元集編碼的基本 單位由現行的7或8個位元一舉擴充為16個位元,並且充分利用65,536 個編碼位置以容納全世界各種語言的字元和常用符號。新的字元集 編碼標準被命名為“Unicode”(註3)。一群來自Xerox公司和Apple 公司的工程師組成工作小組,負責Unicode的原始設計工作。1991年 元月,十多家電腦硬軟體、網路和資訊服務業者,包括:IBM、DEC、 Sun、Xerox、Apple、MicroSoft、Novell名公司,共同出資成立 Unicode協會(The Unicode Consortium),並由協會設立非營利的 Unicode公司。Unicode協會成立之後,將原先的工作小組擴編為 Unicode技術委員會(Unicode Technical Committee),專責Unicode 的字元搜集、整理、編碼等工作。推動Unicode成為國際標準的工作, 則由Unicode公司負責。Unicode草案第一版於1989年9月發表,歷經 多次修訂後,分別於1991、92年出版了Unicode標準第一版(The Unicode Standard, version 1.0)的第一、第二冊。 由於Unicode協會持續的遊說和施壓,WG2終於放棄原先選擇的ISO2022 八位元延伸編碼結構,改採Unicode的編碼方式,亦即連續編碼不再避開 C0和C1控制碼區。1991年10月,歷經幾個月的協商之後,WG2和Unicode 協會達成協議,將Unicode併入ISO10646成為第0字面。之後各國語言字 元的搜集、整理和編碼等工作轉由WG2主導,而Unicode協會則積極協助 WG2,但雙方仍然各自出版自己的編碼標準。由於雙方標準的整合是在 Unicode標準第一版第一冊出版之後才展開的,因此該版次標準的第二 冊特別在第一章裡說明了為因應合併工作所做的編碼區和字元集修訂項 目。ISO於199月出版ISO10646-1(註4)的第一版,而第二版則經過多年 修訂之後於今年3月出版。介於ISO10646-1第一、二版之間的Unicode標 準第二版於1996年出版,而對應於ISO10646-1第二版的Unicode標準第三 版於今年一月出版。今年三月,在北京舉行的WG2第38次會議正式通過 ISO10646-2(註5)最終草案,預定五月底編輯完成後送交各會員國審 查,如無意外,明後年將會正式出版。 二、編碼結構與字元集 ISO10646字元碼的正規形式(可簡稱為UCS-4)為32個位元,劃分 成4個八位元,如【圖一】所示。這4個八位元,由左而右命名為群 八位元(G-octet)、面八位元(P-octet)、列八位元(R-octet) 和格八位元(C-octet),分別代表編碼結構中的群組(group)、 字面(plane)、列(row)與格(cell)。ISO10646規定其字元碼 的b32必須為0,因而整個編碼空間可區分為128個群組(群八位元 的值為00∼7Fh(註6)),每一群組由256個字面所組成(面八位 元為00∼FFh),每一個字面由256列所組成(列八位元為00∼FFh), 每一列則包含256格(格八位元為00∼FFh),為一個編碼位置。除 此之外,ISO10646還規定每一個字面的最後兩個編碼位置FFFEh和 FFFFh,保留不用。所以,ISO10646整個編碼空間總共256×128= 32,768個字面,每個字面為256×256-2=65,534個編碼位置,合 計65534×32768=2,147,418,112個編碼位置。 ISO10646的第0群組第0字面(群八位元和面八位元的值都為00h) 稱為「基本多語文字面」(Basic Multi-lingual Plane, BMP), 其編碼字元與Unicode相同。BMP之外的32,767個字面區分為輔助字 面(supplementary planes)和專用字面(private use planes)。 輔助字面用以收容WG2陸續收集、整理和編碼的各國語文字元;專 用字面的內容WG2不予規定,保留供使用者自行添加ISO10646未收 容的字元。專用字面共8,226個,包括00h群組的0Fh、10h和E0∼ FFh共計34個字面,以及60∼7Fh共32個群組的8,192個字面。除了 這8,226個專用字面之外,其餘的24,541個字面都是輔助字面。 當電腦系統只使用BMP的字元碼時,可以省略群八位元和面八位 元,因而而將字元碼由32個位元縮短為16個位元,稱為ISO10646 字元碼的基本面形式(可簡稱為UCS-2),其實也可視同於Unicode。 ISO10646所有字面中,目前僅有第0、第1和第2字面真正收容 編碼字元。ISO10646的BMP和Unicode的編碼字元,依其UCS-2編 碼序介紹如下: (1)0000∼007Fh:基本拉丁字母區。其中0000∼001Fh為C0控 制碼,0020h為空格(space),0021∼007Eh為ASCII圖形 字元,007Fh為控制碼DEL。事實上,這128個字元碼只要 把前8個位元去掉就可變成習見的8位元形式的ASCII碼。 (2)0080∼00A0h:控制碼區。其中0080∼009Fh為C1控制碼, 00A0h為不中斷空格(no-break space)。 (3)00A1∼1FFFh:拼音文字區。收容除基本拉丁字母以外的各種 拼音文字字元,包括歐洲各國語言、希臘文、斯拉夫語文、 希伯來文、阿拉伯文、亞美尼亞文、印度各地方言、馬來文、 泰文、寮文、柬普寨文、滿文、蒙文、藏文、印地安語文等。 (4)2000∼28FFh:符號區。收容各種符號,包括標點符號、上下 標、錢幣符號、數字、箭頭、數學符號、工程符號、光學辨 識符號、帶圈或帶括符的文數字、表格繪製符號、地理圖示、 盲用點字、裝飾圖形等。 (5)2E80∼33FFh:中日韓符號區。收容康熙字典部首、中日韓輔 助部首、注音符號、日本假名、韓文音符,中日韓的符號、 標點、帶圈或帶括符文數字、月份,以及日本的假名組合、 單位、年號、月份、日期、時間等。 (6)3400∼4DFFh:中日韓認同表意文字擴充A區,總計收容6,582 個中日韓漢字。 (7)4E00∼9FFFh:中日韓認同表意文字區,總計收容20,902個中 日韓漢字。 (8)A000∼A4FFh:彝族文字區,收容中國南方彝族文字和字根。 (9)AC00∼D7FFh:韓文拼音組合字區,收容以韓文音符拼成的文 字。 (10)D800∼DFFFh:S區,專用於UTF-16,詳情後敘。 (11)E000∼F8FFh:專用字區,其內容WG2不予規定,保留供使用 者自行添加ISO10646未收容的字元。 (12)F900∼FAFFh:中日韓相容表意文字區,總計收容302個中日 韓漢字。何謂相容表意文字,留待後敘。 (13)FB00∼FFFDh:文字表現形式區,收容組合拉丁文字、希伯來 文、阿拉伯文、中日韓直式標點、小符號、半形符號、全形 符號等。 WG2集各國專家之力共同整理全世界古今各種語言文字和符號,陸 續編入ISO10646。WG2依語言特性把各種文字區分為表意文字和非表 意文字兩類,表意文字其實就是東亞各國所使用發源於中國的漢字, 主要包括台灣、中國、日本、南北韓、越南、新加坡和港澳地區所使 用的漢字。除漢字之外的所有其他文字,一律歸類為非表意文字,絕 大部分為拼音文字。ISO10646的BMP和Unicode同時收編非表意文字、 符號和表意文字。但全世界古今各種語言文字和符號的數量何其龐大, 單靠BMP不足以容納。WG2截至目前為止所收集、整理的非表意文字和 符號部分,扣除已編入BMP者,其餘全部編入第1字面,由於其內容項 目過於龐雜,本文不擬介紹。而表意文字部分扣除已編入BMP者,其 餘全部編入第二字面,其內容為: (1)中日韓認同表意文字擴充B區:總計42,807個中日韓越漢字, 編碼範圍為0002-0100∼0002-A836h。 (2)CNS11643相容字元區:收容被認同的CNS11643字元527個,編 碼範圍為0002-F800∼0002-FA16h。 WG2制訂ISO10646編碼字元集,首先由各會員體或觀察員收集整理 自己國家的文字和符號向WG2提案(註7),WG2每半年召開會議審查 字元集提案,通過者即予以編碼或是等候匯集更多字元集後再進行 編碼。非表意文字或符號,因為字集小或是只有某個國家使用,通 常直接在WG2會議上討論即可。但漢字字集規模龐大且為多個國家和 地區共同使用,WG2為此設置表意文字書記小組(Ideograph Rapporteur Group, IRG)專責收集各國漢字字集,加以比對認同彙整成為整體 性字集之後再向WG2提出。IRG所建議的字元集,WG2向來都是直接 接受予以編碼。IRG各會員體所提出的漢字都源自中國,難免有些字 的字形相同或極為近似。為了避免ISO10646編碼表出現重複字造成 使用者困擾,IRG制訂了表意文字認同規則。凡是依規則應予認同的 漢字,一律合併成一字賦予一個編碼。不過為了尊重各國對各自文 字的主控權,WG2特別在ISO10646編碼表中並列同一漢字不同來源的 各自字形。 認同規則不僅運用於整合不同來源的漢字,同時適用於相同來源 的漢字。例如,在我國中文碼國家標準CNS11643的字集裡就收編了 兩個極為相似的「圖」字,分別賦予兩個不同的碼1-6837h和6-5B5Bh, 這兩個「圖」字,依認同規則必須合併為一個,於是後者被前者認 同掉了。詳言之,CNS的1-6837h和6-5B5Bh都對應到Unicode的5716h (或ISO10646的0000-5716h),但是Unicode的5716h卻只對應到CNS 的1-6837h。當我們把資料從CNS碼轉換成Unicode,再由Unicode轉回 CNS碼時,將發生6-5B5Bh→5716h→1-6837h的結果,這種現象稱為去 回轉碼(round-trip conversion)錯誤。解決之道無他,必須在 Unicode或ISO10646字集中多加上被認同掉的字元並另外賦予編碼 (稱為相容字元),做到CNS字集與ISO10646字集一對一(但不必 也無法做到映成)。ISO10646第2字面所收容的CNS相容字集,就是 我國為了達到正確去回轉碼的目的,經多年力爭所得成果。換言之, CNS11643現有中文字集已全數編入ISO10646編碼表中。       (下期待續) 參考資料: 註1:ISO為國際標準組織(International Organization for Standardization)的英文縮寫;IEC為聯合國下屬國際電 氣技術委員會(International Electro-technical Commission)的英文縮寫;JTC1係由ISO和IEC雙方協議共 組的第一聯合技術委員會(Join Technical Committee One), 負責制訂與資訊處理、資訊技術相關的國際標準;JTC1/SC2 為設於JTC1之下的第二分組委員會(Sub-Committee Two); 而JTC1/SC2/WG2則是JTC1/SC2之下的第二工作組(Working Group Two)。在我國,經濟部標準檢驗局設有對應ISO/IEC JTC1/SC2的組織,稱為資訊及通信國家標準起草委員會, 而對應ISO/IEC JTC1/SC2/WG2者,稱為中文資訊標準分組 委員會。筆者同時擔任這兩個組織的委員。 註2:C0控制碼區指的是編碼為0∼31的32個控制碼(其bit-8為0), 而C1控制碼區則是意指128∼159的32個控制碼(其bit-8為1)。 關於C0和C1控制碼詳情,請參考ISO6429或CNS13479。 註3:國內有人將Unicode譯為「統一碼」。 註4:ISO10646-1為該標準的第一部份,正式名稱為“ISO/IEC 10646-1: Universal Multiple-Octet Coded Character Set - UCS - Part 1: Architecture and Basic Multilingual Plane (BMP)”,其 內容僅及於ISO10646的編碼結構和第0字面的編碼表。 註5:ISO10646-2為該標準的第二部份,正式名稱為“ISO/IEC 10646-2: Universal Multiple-Octet Coded Character Set - UCS - Part 2: CJK Unified Ideographs Supplementary Plane, General Scriptsand Symbols Plane, General Purpose Plane”,其內容主要包括 第1字面非表意文字、符號的編碼表,以及第2字面中日韓認同 表意文字和相容表意文字的編碼表。 註6:在此,h表示16進制數字,每一數位的值為0∼15,分別表示 為0∼9和 A(10)、B(11)、C(12)、E(13)、D(14)和F(15)。 註7:我國為WG2的觀察員和IRG的會員體,本文作者目前為這兩個 組織的我國代表。