Unicode

Unicode是規定了一致性處理全世界文字的字集編碼字元集、字元編碼方式的字碼業界規格。目前最新版本是2021年9月公布的14.0.0,已收錄超過14萬個字元。


早年每個國家、廠商都自行制定不同的字碼表,互相無法相容,也缺乏在相同環境處理不同字碼表的方式(例如早年繁簡文字不能共存,台商在中國的子公司內部也照樣用Big5等),這也讓軟體需要為各語言客製化開發不同版本、也不利於網際網路資料流通。

1980年代末期,Xerox、微軟、Apple、IBM……等眾多廠商聯合組成了Unicode聯盟(Unicode Consortium),試圖制定出一個能囊括全球語言、文字的單一字元編碼,以改善原來的不便。之後國際標準ISO/IEC 10646也與Unicode進行整合。


Unicode也設計成能夠盡可能相容既有的字元編碼,例如為全形字元編碼,讓CJK文字原有資料的全形、半形能夠在Unicode上繼續區別。對於幾個主要的既有編碼,如Big5,也確保了來回相容性(見相容漢字)。雖然這讓Unicode收字其實不是完全的理想化,處處充滿為了相容既有規格而作的妥協,但也因此能夠順利讓所有語言、環境都順利逐漸過渡到Unicode。

發展概要

主要歷史

創立經過

1984年,ISO的字元編碼規格委員会 (ISO/TC 97/SC2) 決定著手制定一套不需要切換字元集,可以囊括全世界所有文字的單一字元集的字碼規格 (ISO 10646) ,並設立專屬作業群組 (ISO/TC 97/SC 2/WG 2) 開始作業。此群組花費數年討論過各種提案後,於1990年推出ISO 10646的初版草稿(DIS 10646#DIS 10646第1版)。這份草稿裡,漢字以32位元處理,並直接將各國的漢字表各自放進表裡,互相獨立。但中國不希望漢字個別分開編碼,希望能統合起來處理,而反對這份草案。故WG 2又另外成立了CJK-JRG (Joint Research Group) 群組另外來討論漢字的編碼方針。


在這個官方組織之外,1987年前後,Xerox 的 Joe Becker 與 Lee Collins 也開發了一套收錄了全世界所有文字的編碼,並於1989年9月以「Unicode Draft 1」的名稱發表。這份規格則試圖以16位元的固定長度來處理全世界所有文字,所以積極對CJK漢字進行統合到2萬字上下,還保留了約3萬字的空間可供未來編碼其它文字。經過多次細節微調後,在1991年1月時,許多支持廠商合組了 Unicode 聯盟,發布了 Unicode Final Draft。


1991年6月,由於各國多傾向支持16位元的Unicode方案,ISO/IEC 10646 的「DIS 10646第1版」草稿遭到否決。自此 ISO 10646 開始試圖與 Unicode 進行整合。在中國與Unicode聯盟的積極介入之下,CJK-JRG也開始著手進行ISO 10646 與 Unicode 的整合。CJK-JRG 先以各國的漢字表為基準,制定了漢字統合標準,編訂了ISO 10646 / Unicode用的統合漢字表。


自此後,雖然Unicode與ISO 10646是各自維護的不同標準,實際上是相同內容的編碼表,兩者保持相容。例如Unicode 1.1對應於ISO 10646-1:1993,Unicode 3.0對應於ISO 10646-1:2000,Unicode 3.2對應於ISO 10646-2:2001,Unicode 4.0對應於ISO 10646:2003,Unicode 5.0對應於ISO 10646:2003及附錄1–3。

相較於ISO 10646主要公布的是字碼表,Unicode聯盟則維護更多細節的資料。有許多技術報告,以及UniHan資料庫等。

Unicode技術文件與UCD

Unicode作為一個處理全世界所有文字體系的編碼,面對各國書寫體系的複雜性,又承受既有規格的相容問題,制定了大量的技術文件來解釋Unicode文字應該怎樣被處理。例如:

其中很多技術文件都是特定文字體系才會碰到的問題,對其他語系使用者來說可能一輩子都碰不到。藉由Unicode技術文件的形式,才讓不同文化的軟體作者得以得知其它語系的需求,並盡可能加以支援,儼然是世界語言文化的寶庫。


配合這些技術文件,Unicode裡每個文字都被標註著大量的資訊。例如前述的直排方向、雙向書寫定義,以及正規化會用到的分解序列、組合類別等。這些資料以 Unicode Database (UCD) 的形式公開在 Unicode 官方網站上。本站字碼資料庫也可以查詢到13.0版為止的UCD。

編碼

收錄原則

The Unicode Standard Version 6.2 – Core Specification》文件提示了Unicode的十大設計原則:

補充平面

1980年代初期的構想中,Unicode是16位元固定長度,共65,536的碼位來收錄全世界的文字。然而在Unicode 1.0發表時,各國就殺紅眼爭奪預留的2萬多字空間。如台灣、日本、中國、越南、新加坡提出的新增漢字就有15,000字,古韓文音節約5000字,還有大量未收錄的語言。

於是乎Unicode打算用16位元收集全世界所有文字的算盤早在這個時候就已經觸礁,1996年發表Unicode 2.0時,就決定擴充增加碼點空間。但1996年當時,已經有許多系統(如Java的char型別、Windows NT的系統API)以16位元為前提支援Unicode,所以又設計了代理對機制去相容這些系統。詳見UTF-16

平面

每個平面包含65,536個碼點。

平面碼點英文名稱縮寫中文名稱說明
第0平面0000-FFFFBasic Multilingual PlaneBMP基本多言語平面世界主要常用文字均定義在此平面。
第1平面10000-1FFFFSupplementary Multilingual PlaneSMP補充多言語平面古代文字、罕用符號、Emoji等。
第2平面20000-2FFFFSupplementary Ideographic PlaneSIP表意文字補充平面整個平面都用來放罕用漢字。
第3平面30000-3FFFFTertiary Ideographic PlaneTIP第三漢字面表意文字補充平面放不下的漢字,未來計畫收錄甲骨文等古漢字。
第4~13平面40000-DFFFF未使用(未來用途亦尚未決定)。
第14平面E0000-EFFFFSupplementary Special-purpose PlaneSSP特別用途補充平面擺放特殊控制字元,目前只有語言標籤與異體字選擇子。
第15~16平面F0000-10FFFFPrivate Use PlanePUP私人使用區全部保留作為造字區使用。

字元編碼方式

Unicode正式規定的編碼方式有 UTF-8UTF-16UTF-32 三種,以相容各種不同的處理環境,亦各有優劣。

請參考這些條目的詳細說明。