Unicode

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

Unicode 伴隨著通用字元集 ISO/IEC 10646 的標準而發展，同時也以書本的形式對外發表。Unicode 至今仍在不斷增修，每個新版本都加入更多新的字元。目前最新的版本為 2024 年 9 月公佈的 16.0.0，已經收錄超過 15 萬個字元（第十萬個字元在 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 編碼包含了不同寫法的字，如 “／”、“強／強”、“戶／戶／戸”。然而在漢字方面引起了一字多形的認定爭議，詳見中日韓統一表意文字。

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

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

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

1.1 標準

位於美國加州的 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 起，既有的區段可擴充套件或縮減（必須在沒有字元使用空間的前提下，若已有字元佔用空間不可縮減區段），第一個自 Unicode 1.1 以來擴充套件的既有區段為阿洪姆文（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 年引入標準。

1.2 歷史

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

其中，因應 2019 冠狀病毒病疫情，Unicode 14.0 由 2021 年 3 月延後至 2021 年 9 月釋出。

Unicode 的編碼和實現

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

2.1 十大設計原則

《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 與其他著名字元集可以精確轉換。

2.2 編碼方式

統一碼的編碼方式與 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。

2.3 實現方式

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 編碼的對應關係要複雜得多。

2.4 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 程式碼。如果採用十六進位制程式碼，在編碼之前加上字元即可。但部分舊版本的瀏覽器可能無法識別十六進位制程式碼。

過去電腦編碼的 8 位標準，使每個國家都只按國家使用的字元而編定各自的編碼系統；而對於部份字元系統比較複雜的語言，如越南語，又或者東亞國家的大型字元集，都不能在 8 位的環境下正常顯示。

只是最近才有在文字中對十六進位制的支援，那麼舊版本的瀏覽器顯示那些字元或許可能有問題 —— 大概首先會遇到的問題只是在對於大於 8 位 Unicode 字元的顯示。解決這個問題的普遍做法仍然是將其中的十六進位制碼轉換成一個十進位制碼（例如：用代替）。

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

然而部分由於 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，首先按下，然後輸入 16 進位制 Unicode 數，如 interpunct 間隔符輸入，最後按空格鍵；
Microsoft Windows 系統，按下表示 interpunct 間隔符。

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

5.1 中文輸入法

截至 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 區的漢字尚無編碼。

5.2 日文輸入法

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

5.3 其他

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

參閲

Wikipedia:Unicode 擴充套件漢字
Unicode 字元平面對映
Unicode 聯盟
Unicode 字元列表
Unicode 數字
中日韓統一表意文字（CJK/Unihan）
通用字元集
寬字元
UTF-8
萬國音標（表示語言讀音）