统一字符编码标准

**Unicode**，全稱為 **Unicode 標準**（The Unicode Standard），其官方機構 Unicode 聯盟所用的中文名稱為**統一碼**，又譯作**萬國碼**、**統一字元碼**、**統一字符編碼**，是資訊科技領域的業界標準，其整理、編碼了世界上大部分的文字系統，使得電腦能以通用劃一的字元集來處理和顯示文字，不但減輕在不同編碼系統間切換和轉換的困擾，更提供了一種跨平臺的亂碼問題解決方案。Unicode 由非營利機構 Unicode 聯盟（Unicode Consortium）負責維護，該機構致力讓 Unicode 標準取代既有的字元編碼方案，因為既有方案編碼空間有限，亦不適用於多語環境。

Unicode 伴隨著通用字元集 ISO/IEC 10646 的標準而發展，同時也以書本的形式對外發表。Unicode 至今仍在不斷增修，每個新版本都加入更多新的字元。目前最新的版本為 2022 年 9 月公布的 15.0.0，已經收錄超過 14 萬個字元（第十萬個字元在 2005 年獲採納）。Unicode 標準不僅僅只是為文字指定代碼。除了涵蓋視覺上的字形、編碼方法、標準的字元編碼資料外，聯盟官方出版品還包含了關於各書寫系統的細節及呈現方式，如規格化的準則、拆分、定序、繪製、雙向文字顯示、書寫方向、字元特性（如大小寫字母）等等。此外還提供參考資料和視覺圖像，以幫助開發者和設計師正確應用標準。

Unicode 備受認可，為 ISO 納入國際標準，成為通用字元集，即 ISO/IEC 10646。Unicode 相容 ISO/IEC 10646，能完整對應各個版本標準。Unicode 廣泛應用於電腦軟體的國際化與在地化過程。很多新科技，如可延伸標示語言（Extensible Markup Language，簡稱：XML）、Java 程式語言以及現代作業系統，都採用 Unicode 來編碼。Unicode 最普遍的編碼格式是和 ASCII 相容的 UTF-8，以及和 UCS-2 相容的 UTF-16。

## 起源與發展

Unicode 為解決傳統字元編碼方案的侷限而產生，例如 ISO 8859-1 所定義的字元雖然在不同的國家中廣泛地使用，可是在不同國家間卻經常出現不相容的情況。很多傳統的編碼方式都有共同的問題，即容許電腦處理雙語環境（通常使用拉丁字母以及其本地語言），但卻無法同時支援多語言環境（指可同時處理多種語言混合的情況）。

Unicode 編碼包含了不同寫法的字，如「ɑ／a」、「強／强」、「戶／户／戸」。然而在漢字方面引起了一字多形的認定爭議，詳見中日韓統一表意文字。

在文字處理方面，萬國碼為每一個字元而非字形定義唯一的代碼（即一個整數）。換句話說，萬國碼以一種抽象的方式（即數字）來處理字元，並將視覺上的演繹工作（例如字體大小、外觀形狀、字體形態、文體等）留給其他軟體來處理，例如網頁瀏覽器或是文字處理器。

目前，幾乎所有電腦系統都支援基本拉丁字母，並各自支援不同的其他編碼方式。Unicode 為了和它們相互相容，其首 256 個字元保留給 ISO 8859-1 所定義的字元，使既有的西歐語系文字的轉換不需特別考量；並且把大量相同的字元重複編到不同的字元碼中去，使得舊有紛雜的編碼方式得以和 Unicode 編碼間互相直接轉換，而不會遺失任何資訊。舉例來說，全形格式區段包含了主要的拉丁字母的全形格式，在中文、日文、以及韓文字形當中，這些字元以全形的方式來呈現，而不以常見的半形形式顯示，這對豎排文字和等寬排列文字有重要作用。

在表示一個 Unicode 的字元時，通常會用「U+」然後緊接著一組十六進位的數字來表示這一個字元。在基本多文種平面裏的所有字元，要用四個數字（即 2 位元組，共 16 位元，例如 U+4AE0，共支援六萬多個字元）；在零號平面以外的字元則需要使用五或六個數字。舊版的 Unicode 標準使用相近的標記方法，但卻有些微小差異：在 Unicode 3.0 裏使用「U-」然後緊接著八個數字，而「U+」則必須隨後緊接著四個數字。

### 標準

位於美國加州的 Unicode 組織允許任何願意支付會費的公司和個人加入，其成員包含了主要的電腦軟硬體廠商，例如 Adobe 系統、蘋果公司、惠普、IBM、微軟、全錄等。

20 世紀 80 年代末，組成 Unicode 組織的商業機構，和國際合作的國際標準化組織在電腦普及和資訊國際化的前提下，分別各自成立了 Unicode 組織和 ISO-10646 工作小組。他們不久便發現對方的存在，而大家工作目的一致。1991 年，Unicode Consortium 與 ISO/IEC JTC1/SC2 同意保持 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。

Unicode 自 2.0 版本開始保持了向下相容，即新的版本僅僅增加字元，原有字元不會刪除或更名。但從 Unicode 14.0 起，既有的區段可擴展或縮減，第一個擴展的既有區段為阿洪姆文（Ahom）。

萬國碼聯盟在 1991 年首次發佈了 _The Unicode Standard_。Unicode 的開發結合了國際標準化組織所制定的 ISO/IEC 10646，即通用字元集。Unicode 與 ISO/IEC 10646 在編碼的運作原理相同，但 _The Unicode Standard_ 包含了更詳盡的實現資訊、涵蓋了更細節的主題，諸如位元編碼（bitwise encoding）、校對以及呈現等。_The Unicode Standard_ 也列舉了諸多的字元特性，例如必須支援兩種閱讀方向的字元（由左至右或由右至左的文字閱讀方向，例如阿拉伯文是由右至左）。Unicode 與 ISO/IEC 10646 兩個標準在術語上的使用有些微的不同。

Unicode 的第十萬個字元（用於馬拉雅拉姆語）於 2005 年引入標準。

### 歷史

截至目前的 Unicode 各版本及其發佈時間如下：

其中，因應嚴重特殊傳染性肺炎疫情，Unicode 14.0 由 2021 年 3 月延後至 2021 年 9 月發布。

## Unicode 的編碼和實現

大概來說，Unicode 編碼系統可分為編碼方式和實現方式兩個層次。

### 十大設計原則

《The Unicode Standard Version 6.2 – Core Specification》 文件給出了 Unicode 的十大設計原則：

* Universality：提供單一、綜合的字元集，編碼一切現代與大部分歷史文獻的字元。
* Efficiency：易於處理與分析。
* Characters, not glyphs：字元，而不是字形。
* Semantics：字元要有良好定義的語意。
* Plain text：僅限於文字字元。
* Logical order：預設記憶體表示是其邏輯序。
* Unification：把不同語言的同一書寫系統（scripts）中相同字元統一起來。
* Dynamic composition：附加符號可以動態組合。
* Stability：已分配的字元與語意不再改變。
* Convertibility：Unicode 與其他著名字元集可以精確轉換。

### 編碼方式

萬國碼的編碼方式與 ISO 10646 的通用字元集概念相對應。目前實際應用的萬國碼版本對應於 UCS-2，使用 16 位的編碼空間。也就是每個字元占用 2 個位元組。這樣理論上一共最多可以表示 216（即 65536）個字元。基本滿足各種語言的使用。實際上目前版本的萬國碼並未完全使用這 16 位元編碼，而是保留了大量空間以作為特殊使用或將來擴充。

上述 16 位元萬國碼字元構成基本多文種平面。最新（但未實際廣泛使用）的萬國碼版本定義了 16 個輔助平面，兩者合起來至少需要占據 21 位的編碼空間，比 3 位元組略少。但事實上輔助平面字元仍然占用 4 位元組編碼空間，與 UCS-4 保持一致。未來版本會擴充到 ISO 10646-1 實現級別 3，即涵蓋 UCS-4 的所有字元。UCS-4 是更大而尚未填充完全的 31 位元字元集，加上恆為 0 的首位，共需占據 32 位元，即 4 位元組。理論上最多能表示 231 個字元，完全可以涵蓋一切語言所用的符號。

基本多文種平面的字元的編碼為 U+hhhh，其中每個 h 代表一個十六進位數字，與 UCS-2 編碼完全相同。而其對應的 4 位元組 UCS-4 編碼後兩個位元組一致，前兩個位元組則所有位均為 0。

### 實現方式

Unicode 的實現方式不同於編碼方式。一個字元的 Unicode 編碼確定。但是在實際傳輸過程中，由於不同系統平台的設計不一定一致，以及出於節省空間的目的，對 Unicode 編碼的實現方式有所不同。Unicode 的實現方式稱為 **Unicode 轉換格式**（Unicode Transformation Format，簡稱為 UTF）。

例如，如果一個僅包含基本 7 位 ASCII 字元的 Unicode 檔案，如果每個字元都使用 2 位元組的原 Unicode 編碼傳輸，其第一位元組的 8 位元始終為 0。這就造成了比較大的浪費。對於這種情況，可以使用 UTF-8 編碼，這是變長編碼，它將基本 7 位 ASCII 字元仍用 7 位編碼表示，占用一個位元組（首位補 0）。而遇到與其他 Unicode 字元混合的情況，將按一定演算法轉換，每個字元使用 1-3 個位元組編碼，並利用首位為 0 或 1 辨識。這樣對以 7 位 ASCII 字元為主的西文文件就大幅節省了編碼長度（具體方案參見 UTF-8）。類似的，對未來會出現的需要 4 個位元組的輔助平面字元和其他 UCS-4 擴充字元，2 位元組編碼的 UTF-16 也需要通過一定的演算法轉換。

再如，如果直接使用與 Unicode 編碼一致（僅限於 BMP 字元）的 UTF-16 編碼，由於每個字元占用了兩個位元組，在麥金塔電腦（Mac）機和個人電腦上，對位元組順序的理解不一致。這時同一位元組流可能會解釋為不同內容，如某字元為十六進位編碼 4E59，按兩個位元組拆分為 4E 和 59，在 Mac 上讀取時是從低位元組開始，那麼在 Mac OS 會認為此 4E59 編碼為 594E，找到的字元為「奎」，而在 Windows 上從高位元組開始讀取，則編碼為 U+4E59 的字元為「乙」。就是說在 Windows 下以 UTF-16 編碼儲存一個字元「乙」，在 Mac OS 環境下開啟會顯示成「奎」。此類情況說明 UTF-16 的編碼順序若不加以人為定義就可能發生混淆，於是在 UTF-16 編碼實現方式中使用了大端序（Big-Endian，簡寫為 UTF-16 BE）、小端序（Little-Endian，簡寫為 UTF-16 LE）的概念，以及可附加的位元組順序記號解決方案，目前在個人電腦上的 Windows 系統和 Linux 系統對於 UTF-16 編碼預設使用 UTF-16 LE。（具體方案參見 UTF-16）

此外 Unicode 的實現方式還包括 UTF-7、Punycode、CESU-8、SCSU、UTF-32、GB18030 等，這些實現方式有些僅在一定的國家和地區使用，有些則屬於未來的規劃方式。目前通用的實現方式是 UTF-16 小端序（LE）、UTF-16 大端序（BE）和 UTF-8。在微軟公司 Windows XP 附帶的記事本（Notepad）中，「另存為」對話方塊可以選擇的四種編碼方式除去非 Unicode 編碼的 ANSI（對於英文系統即 ASCII 編碼，中文系統則為 GB2312 或 Big5 編碼）外，其餘三種為「Unicode」（對應 UTF-16 LE）、「Unicode big endian」（對應 UTF-16 BE）和「UTF-8」。

目前輔助平面的工作主要集中在第二和第三平面的中日韓統一表意文字，因此包括 GBK、GB18030、Big5 等簡體中文、繁體中文、日文、韓文以及越南喃字的各種編碼與 Unicode 的協調性受重點關注。考慮到 Unicode 最終要涵蓋所有的字元。從某種意義而言，這些編碼方式也可視作 Unicode 的出現於其之前的**既成事實**的實現方式，如同 ASCII 及其擴充 Latin-1 一樣，後兩者的字元在 16 位元 Unicode 編碼空間中的編碼第一位元組各位全為 0，第二位元組編碼與原編碼完全一致。但上述東亞語言編碼與 Unicode 編碼的對應關係要複雜得多。

### Unicode 字元平面對映

Unicode 將編碼空間分成 17 個平面，以 0 到 16 編號。

第 0 平面（或者說基本多文種平面）中的碼點，都可以用一個 UTF-16 單位來編碼，或者以 UTF-8 來編碼的話，會使用一、二或三個位元組。而第 1 到 16 平面（或稱輔助平面）中的碼點，UTF-16 會以代理對的方式來使用，而 UTF-8 則會編碼成 4 個位元組。

在每個平面中，會先將相關的字元集結為區段的形式。雖然區段可以是任意大小，但會以 16 個碼點的倍數，且通常是 128 個碼點的倍數。而一份文稿中使用到的區段，可能會散布在多個區段中。

## 非 Unicode 環境

在非 Unicode 環境下，由於不同國家和地區採用的字元集不一致，很可能出現無法正常顯示所有字元的情況。微軟公司使用了頁碼（Codepage）轉換表的技術來過渡性地部分解決這一問題，即通過指定的轉換表將非 Unicode 的字元編碼轉換為同一字元對應的系統內部使用的 Unicode 編碼。可以在「語言與區域設定」中選擇一個頁碼作為非 Unicode 編碼所採用的預設編碼方式，如 936 為簡體中文 GB 碼，950 為繁體中文 Big5（皆指 PC 上使用的）。在這種情況下，一些非英語的歐洲語言編寫的軟體和文件很可能出現亂碼。而將頁碼設定為相應語言中文處理又會出現問題，這一情況無法避免。只有完全採用統一編碼才能徹底解決這些問題，但目前尚無法做到這一點。

頁碼技術現在廣泛為各種平台所採用。UTF-7 的頁碼是 65000，UTF-8 的頁碼是 65001。

## XML 和 Unicode

XML 及其子集 XHTML 採用 UTF-8 作為標準字元集，理論上我們可以在各種支援 XML 標準的瀏覽器上顯示任何地區文字的網頁，只要電腦本身安裝有合適的字型即可。可以利用 `&#`nnn`;` 的格式顯示特定的字元。nnn 代表該字元的十進位 Unicode 代碼。如果採用十六進位代碼，在編碼之前加上 `x` 字元即可。但部分舊版本的瀏覽器可能無法辨識十六進位代碼。

過去電腦編碼的 8 位元標準，使每個國家都只按國家使用的字元而編定各自的編碼系統；而對於部份字元系統比較複雜的語言，如越南語，又或者東亞國家的大型字元集，都不能在 8 位元的環境下正常顯示。
只是最近才有在文字中對十六進位的支援，那麼舊版本的瀏覽器顯示那些字元或許可能有問題 —— 大概首先會遇到的問題只是在對於大於 8 位元 Unicode 字元的顯示。解決這個問題的普遍做法仍然是將其中的十六進位碼轉換成一個十進位碼（例如：`♠` 用 `&#9824;` 代替 `&#x2660;`）。

也有一些字元集標準將一些常用的標誌存放在字元內碼外面，那麼你可能使用像 `—` 這樣的文字標誌來表示一個長劃（—）的情況，即使它的字元內碼已經使用，這些標準也不包含那個字元。

然而部分由於 Unicode 版本發展原因，很多瀏覽器只能顯示 UCS-2 完整字元集，也即現在使用的 Unicode 版本中的一個小子集。下表可以檢驗您的瀏覽器如何顯示各種 Unicode 代碼：

一些多語言支援的網頁瀏覽器，比如 Microsoft Windows 系統的 Internet Explorer 5.5 及以上版本，以及跨平台的瀏覽器 Mozilla/Netscape 6，可以在安裝時根據需要動態地使用相應的字元集，預先安裝了合適的語言套件，就可以同時顯示頁面上的各種 Unicode 字元。Internet Explorer 5.5 還提出使用者可以在需要新字型時，即裝即用。另外的瀏覽器如 Netscape Navigator 4.77，則只能顯示跟頁面編碼相應字元集中的文字。當你使用後一種瀏覽器時，你不大可能預先安裝所有的字型，即使有了字型，瀏覽器也不一定能將這些字型完全應用起來。可能遇到的情況是，這種瀏覽器只能夠顯示部分文字，因為它們是按照標準編碼，儘管理論上在相容的系統中，只要有了相應的 Code2000 字型，就可以正確顯示。一種變通的辦法，是將某些少見的字元，通過「名稱實體參照」的方式來使用。

## 輸入方法

不同的作業系統，各有直接輸入 Unicode 字元的方法：

* 基於 X Window System 的 Linux 系統，如 Ubuntu 的 Gnome Terminal，首先按下 `Ctrl`+`Shift`+`U`，然後輸入 16 進位 Unicode 數，如 interpunct 間隔符輸入 `0``0``b``7`，最後按空格鍵；
* Microsoft Windows 系統，按下 `Alt`+`0``1``8``3` 表示 interpunct 間隔符。

在 SGML、HTML、XML 的文字中，使用字元值參照或字元實體參照表示一個 Unicode 字元。

### 中文輸入法

截至 2011 年 10 月，可以使用微軟拼音 2003 或 2007 版本、倉頡輸入法第三代第五代第六代版本、鄭碼 Unicode 版本、海峰五筆 9.3 版本、新注音輸入法和 VimIM 輸入。

* 微軟拼音在輸入法啟動狀態下，單擊語言欄上的「功能選單」按鈕，指向「輔助輸入法」即可發現「Unicode 碼輸入方式」，利用它可以直接輸入 Unicode 相應十六進制值的方式輸入相應文字。例如中文「胥」輸入「5066」，朝鮮文字「셅」輸入「c145」（不需要在前面加 0x 或 x）。新版本下也可以輸入 VUC（大小寫不敏感）再輸入編碼。
* 倉頡輸入法已爲 Unicode 漢字、類漢字編碼，可以在倉頡輸入法方式下通過倉頡碼輸入方式輸入 Unicode 內的中日韓漢字及韓文。以倉頡輸入法第五代爲例，例如漢字「㗎」輸入「口大口木」，漢字「胥」輸入「弓人月」，漢字「㿱」輸入「手中木竹水」，朝鮮文字「닮」輸入「尸卜尸女口」。由於朱邦復工作室使用的倉頡系統收字比 Unicode 還多，目前 Unicode 既有漢字皆已有倉頡編碼。
* 鄭碼已爲 Unicode 漢字、類漢字編碼，可以在鄭碼輸入法方式下通過鄭碼字碼輸入方式輸入 Unicode 內的中日韓漢字及韓文。例如漢字「㗎」輸入「JYJF」，漢字「胥」輸入「XIQ」，漢字「㿱」輸入「DPXI」，朝鮮文字「길」輸入「XIYY」。
* 海峰五筆此輸入法已經直接支援透過五筆碼輸入方式輸入 Unicode 內的任意中日韓漢字，但無法使用鍵入 Unicode 碼的方式輸入。例如漢字（Unicode 部分）「㗎」為「keks」，CJK 擴充 B 區的「𣿱」為「iyho」和 CJK 擴充 C 區的「𫆦」為「muih」。
* 新注音輸入法在輸入法啟動狀態時，打入鍵盤上的「多功能前導字元鍵」（即通用鍵盤上之「`」），第一次使用會彈出說明。輸入 Unicode 字元「胥」則是在鍵盤上鍵入「`U5066」。而韓語中的「셅」，則輸入「`UC145」。而要輸入日語自製漢字「峠」，則是「`U5CE0」。
* VimIM 在 Vim 環境中，可以直接鍵入十進制或十六進制 Unicode 碼。既不需要啟動輸入法，也不需要碼表。
* 嘸蝦米輸入法，支援 Unicode，以 26 個英文字母為組字按鍵，可直接輸入符號、日文漢字及平假名、片假名，但漢字部份一般只支援基本正體中文、簡體中文，擴充 A 區的漢字要另行擴充編碼才能輸入，擴充 B 區的漢字尚無編碼。

### 日文輸入法

使用 Microsoft IME 2007，可以在 IME Pad 找到 Unicode 的點擊表。點擊字元即可輸入。選擇字型可以預覽字元效果。

### 其他

除了輸入法外，作業系統也會提供另外幾種方法輸入 Unicode。像是 Windows 2000 之後的 Windows 系統就提供可點擊的字元對映表。又或者在 Microsoft Word 下，按下 `Alt` 鍵不放，使用數字鍵盤輸入 0 和某個字元的 Unicode 編碼（十進位），再鬆開 `Alt` 鍵即可得到該字元，如 `Alt``0``3``3``8``6``5` 會得到 Unicode 字元 `葉`。另外，按 `Alt``X` 組合鍵，Microsoft Word 也會將游標前面的字元同其十六進位的四位 Unicode 編碼互相轉換。

## 注釋

## 參考文獻

## 參閲

## 外部連結

* Unicode official site（Unicode 官方網站）
* （頁面存檔備份，存於網際網路檔案館）（Unicode 聯盟）
* Unicode 7.0.0 （頁面存檔備份，存於網際網路檔案館）
* DecodeUnicode - Unicode WIKI，提供 Unicode 6.0 全部 109242 個字的 GIF 字型預覽
* Alan Wood's Unicode Resources （頁面存檔備份，存於網際網路檔案館）
* The International Phonetic Alphabet in Unicode（國際音標的 Unicode 編碼）
* CJK Compatibility Ideographs （頁面存檔備份，存於網際網路檔案館）（中日韓相容表意文字）
* Unicode character charts（頁面存檔備份，存於網際網路檔案館）（Unicode 字元對映表）
* UTF-8 和 Unicode 的常見問題
* UTF-8 Codepage （頁面存檔備份，存於網際網路檔案館）（UTF-8 代碼頁）
* Unicode 11.0 （頁面存檔備份，存於網際網路檔案館）（Unicode 11.0 字元匯總，PDF）