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包含了不同寫法的字，如“ɑ／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起，既有的區段可擴展或縮減（必須在沒有字符使用空間的前提下，若已有字符佔用空間不可縮減區段），第一個自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年引入標準。

**版本歷史**
截至目前的Unicode各版本及其發佈時間如下：
其中，因應2019冠狀病毒病疫情，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代碼。如果採用十六進制代碼，在編碼之前加上字符即可。但部分舊版本的瀏覽器可能無法識別十六進制代碼。
過去電腦編碼的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，首先按下key press|Ctrl|Shift|U，然後輸入16進制Unicode數，如interpunct間隔符輸入0b，最後按空格鍵；- Microsoft Windows系統，按下key press|Alt|08表示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鍵即可得到該字符，如Alt385會得到Unicode字元-{葉}-。另外，按Alt組合鍵，Microsoft Word也會將光標前面的字符同其十六進制的四位Unicode編碼互相轉換。

**註釋**

**參考文獻**

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

**外部鏈接**
  Unicode official site（Unicode官方網站）- date=20181225104810 （Unicode聯盟）-  Unicode 7.0.0 date=20220401033040 -  DecodeUnicode - Unicode WIKI，提供Unicode 6.0全部109242個字的GIF字型預覽-  Alan Wood's Unicode Resources date=20220422113856 -  The International Phonetic Alphabet in Unicode（國際音標的Unicode編碼）-  CJK Compatibility Ideographs date=20211124021212 （中日韓兼容表意文字）-  Unicode character chartsdate=20180104171101 （Unicode字符映射表）-  UTF-8和Unicode的常見問題-  UTF-8 Codepage date=20160612115142 （UTF-8代碼頁）-  Unicode 11.0 date=20220121072519 （Unicode 11.0字符彙總，PDF）