Unicode

Unicode（中文：萬國碼、國際碼、統一碼、單一碼）是電腦科學領域裡的一項業界標準。它對世界上大部分的文字系統進行了整理、編碼，使得電腦可以用更為簡單的方式來呈現和處理文字。
Unicode 伴隨著通用字元集的標準而發展，同時也以書本的形式對外發表。Unicode 至今仍在不斷增修，每個新版本都加入更多新的字元。目前最新的版本為2019年5月公布的12.1.0，已經收錄超過13萬個字元（第十萬個字元在2005年獲採納）。Unicode涵蓋的資料除了視覺上的字形、編碼方法、標準的字元編碼外，還包含了字元特性，如大小寫字母。
Unicode發展由非營利機構統一碼聯盟負責，該機構致力於讓 Unicode 方案取代既有的字元編碼方案。因為既有的方案往往空間非常有限，亦不適用於多語環境。
Unicode備受認可，並廣泛地應用於電腦軟體的國際化與在地化過程。有很多新科技，如可延伸標示語言（Extensible Markup Language，簡稱：XML）、Java程式語言以及現代的作業系統，都採用Unicode編碼。

起源與發展

Unicode是為了解決傳統的字元編碼方案的侷限而產生的，例 ISO 8859-1所定義的字元雖然在不同的國家中廣泛地使用，可是在不同國家間卻經常出現不相容的情況。很多傳統的編碼方式都有一個共同的問題，即容許電腦處理雙語環境（通常使用拉丁字母以及其本地語言），但卻無法同時支援多語言環境（指可同時處理多種語言混合的情況）。
Unicode 編碼包含了不同寫法的字，如「ɑ／a」、「強／强」、「戶／户／戸」。然而在漢字方面引起了一字多形的認定爭議（詳見中日韓統一表意文字主題）。
在文字處理方面，統一碼為每一個字元而非字形定義唯一的程式碼（即一個整數）。換句話說，統一碼以一種抽象的方式（即數字）來處理字元，並將視覺上的演繹工作（例如字體大小、外觀形狀、字體形態、文體等）留給其他軟體來處理，例如網頁瀏覽器或是文字處理器。
目前，幾乎所有電腦系統都支援基本拉丁字母，並各自支援不同的其他編碼方式。Unicode為了和它們相互相容，其首 256 個字元保留給 ISO 8859-1 所定義的字元，使既有的西歐語系文字的轉換不需特別考量；並且把大量相同的字元重複編到不同的字元碼中去，使得舊有紛雜的編碼方式得以和Unicode編碼間互相直接轉換，而不會遺失任何資訊。舉例來說，全形格式區段包含了主要的拉丁字母的全形格式，在中文、日文、以及韓文字形當中，這些字元以全形的方式來呈現，而不以常見的半形形式顯示，這對豎排文字和等寬排列文字有重要作用。
在表示一個 Unicode 的字元時，通常會用「U+」然後緊接著一組十六進位的數字來表示這一個字元。在基本多文種平面（英語：Basic Multilingual Plane，簡寫 BMP。又稱為「零號平面」、plane 0）裏的所有字元，要用四個數字（即兩個byte，共16 bits，例如 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 開始保持了向下相容，即新的版本僅僅增加字元，原有字元不會被刪除或更名。 
統一碼聯盟在 1991 年首次發布了 The Unicode Standard。Unicode 的開發結合了國際標準化組織所制定的 ISO/IEC 10646，即通用字元集。Unicode 與 ISO/IEC 10646 在編碼的運作原理相同，但 The Unicode Standard 包含了更詳盡的實現資訊、涵蓋了更細節的主題，諸如位元編碼（bitwise encoding）、校對以及呈現等。The Unicode Standard 也列舉了諸多的字元特性，包含了那些必須支援兩種閱讀方向的文字（由左至右或由右至左的文字閱讀方向，例如阿拉伯文是由右至左）。Unicode 與 ISO/IEC 10646 這兩個標準在術語上的使用有些微的不同。
在 2005 年，Unicode 的第十萬個字元被引入成為標準之一，該字元被用於馬拉雅拉姆語。

Unicode 的編碼和實現

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

編碼方式

統一碼的編碼方式與 ISO 10646 的通用字元集概念相對應。目前實際應用的統一碼版本對應於 UCS-2，使用 16 位的編碼空間。也就是每個字元占用 2 個位元組。這樣理論上一共最多可以表示 2¹⁶（即 65536）個字元。基本滿足各種語言的使用。實際上目前版本的統一碼並未完全使用這 16 位編碼，而是保留了大量空間以作為特殊使用或將來擴充。
上述 16 位統一碼字元構成基本多文種平面。最新（但未實際廣泛使用）的統一碼版本定義了 16 個輔助平面，兩者合起來至少需要占據 21 位的編碼空間，比 3 位元組略少。但事實上輔助平面字元仍然占用 4 位元組編碼空間，與 UCS-4 保持一致。未來版本會擴充到 ISO 10646-1 實現級別 3，即涵蓋 UCS-4 的所有字元。UCS-4 是一個更大的尚未填充完全的 31 位字元集，加上恆為 0 的首位，共需占據 32 位，即 4 位元組。理論上最多能表示 2³¹個字元，完全可以涵蓋一切語言所用的符號。
基本多文種平面的字元的編碼為 U+hhhh，其中每個 h 代表一個十六進位數字，與 UCS-2 編碼完全相同。而其對應的 4 位元組 UCS-4 編碼後兩個位元組一致，前兩個位元組則所有位均為 0。
關於統一碼和 ISO 10646 及 UCS 的詳細關係，見通用字元集。

實現方式

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

日文輸入法

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

其他

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