Unicode編碼

2023-02-09 12:02:44

介紹 Unicode 編碼

Unicode 的全稱是 Unicode 標準(The Unicode Standard)。

Unicode 又被稱為:統一碼、萬國碼、統一字元碼、統一字元編碼。

Unicode 至今仍在不斷增修,每個新版本都加入更多新的字元。目前 Unicode 最新的版本為 2021 年 9 月 14 日公佈的 14.0.0,已經收錄超過 14 萬個字元。


技術是為了解決問題而生的,Unicode 編碼解決了什麼問題,它的作用是什麼呢?

  • Unicode 為解決傳統字元編碼方案的侷限而產生。傳統字元編碼方案的侷限是:它們只能表示一種語言的字元,而不能表示多種語言的字元,這就導致了不同語言的字元無法混合出現在一個文字中。
  • Unicode 編碼了世界上大部分的文字系統,使得電腦能以通用的編碼方案來處理多種語言混合出現的文字。

Unicode 的編碼和實現

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

十大設計原則

Wayback Machine (archive.org)

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

Unicode 的編碼方式

Unicode 為每一個有效字元定義一個唯一的程式碼點(code point,即一個整數)。通常使用十六進位製表示法來表示 Unicode 程式碼點,並使用 "U+" 作為字首。比如,「字母 a」 的 Unicode 程式碼點是 U+0061。

Unicode 的實現方式

Unicode 的實現方式不同於編碼方式。一個字元的 Unicode 編碼結果確定,但是在實際傳輸過程中,由於不同系統平臺的設計不一定一致,以及出於節省空間的目的,對 Unicode 編碼的實現方式有所不同。

系統平臺指的是:在電腦裡讓軟體執行的系統環境,包括硬體環境 和 軟體環境。

Mac 和 Windows 對位元組序的理解不一致。這時同一位元組序列可能會被 Mac 和 Win 解碼為不同內容,比如某字元的程式碼點為 4E59,按兩個位元組拆分為 4E 和 59:

  • 在 Mac 上是從低位元組開始讀取,那麼 Mac 會認為此 4E59 編碼為 594E,找到的字元為 「奎」;
  • 在 Windows 上是從高位元組開始讀取,那麼 Mac 會認為此 4E59 編碼為 4E59,找到的字元為 「乙」。

位元組序指的是:資料在儲存和傳輸時的位元組順序,也就是位元組的排列順序。


Unicode 的實現方式稱為 Unicode 轉換格式(Unicode Transformation Format,簡稱為 UTF)。Unicode 相當於規定了字元對應的程式碼點,這個程式碼點需要轉換為位元組序列的形式去儲存、傳輸。

Unicode 常見的實現方式有:UTF-8、UTF-16小端序(LE)、UTF-16大端序(BE)、UTF-32

在這幾種實現方式的名稱中,「-」 右邊的整數的含義是:以多少個位元位作為一個編碼單元。以 UTF-8 為例,它會以 8 個位元(一個位元組)作為一個編碼單元。

介紹 Unicode 字元平面對映

Unicode 的編碼空間從 U+0000 到 U+10FFFF,共有 1,112,064 個程式碼點(code point)可用來對映字元。Unicode 字元 和 程式碼點是一對一對映的。

Unicode 將編碼空間分成 17 個平面,以 0 到 16 編號。每個平面包含 65536(216)個程式碼點。

  • 第 0 平面被稱為 「基本多文種平面」;
  • 第 1 - 16 平面被稱為 「輔助平面」。

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

平面 始末字元值 中文名稱
0號平面 U+0000 - U+FFFF 基本多文種平面
1號平面 U+10000 - U+1FFFF 多文種補充平面
2號平面 U+20000 - U+2FFFF 表意文字補充平面
3號平面 U+30000 - U+3FFFF 表意文字第三平面
4號平面 至 13號平面 U+40000 - U+DFFFF (尚未使用)
14號平面 U+E0000 - U+EFFFF 特別用途補充平面
15號平面 U+F0000 - U+FFFFF 保留作為私人使用區(A區)
16號平面 U+100000 - U+10FFFF 保留作為私人使用區(B區)

參考資料

Unicode - 維基百科,自由的百科全書 (wikipedia.org)

Unicode字元平面對映 - 維基百科,自由的百科全書 (wikipedia.org)