Unicode詳解

字符集&編碼

  • charset 是 character set 的簡寫,即字符集。
  • encoding 是 charset encoding 的簡寫,即字符集編碼,簡稱編碼。

編號 編碼

  • 字符 <–> 編號 <–> 編碼
  • 編號與編碼的主要區別在於編號不涉及具體使用多少字節來表示、是用定長仍是變長方案等細節問題。編號僅僅是一個抽象的概念,是把字符數字化的一個過程。
  • 字符集 是一組映射關係[字符 - 編號] 具體字符被映射成一個惟一的code--碼點(以下Unicode中)
    • U+[XX]XXXX 是碼點的表示形式,X 表明一個十六制數字,能夠有 4-6 位,不足 4 位前補 0 補足 4 位,超過則按是幾位就是幾位。具體範圍是 U+0000~U+10FFFF
    • U+0048,U+00E6,U+4F60,U+1D11E(這是個五位的碼點)
  • 受編碼影響 編號一般也以十六進制形式書寫,並保持固定的位數,不夠就在前面填充 0,好比把 48 寫成 0048;又好比: U+1D11E 就是一個一個五位的編號。
  • 方便擴展,編碼常跳過某些碼位,甚至保留大片的區域未定義或做保留用途。

小結

  • code point - 碼點 - 對字符的數字化抽象 - 不體現具體的編碼轉換格式
  • 編碼 - UTF(Unicode Transformation Format) - Unicode轉換格式 - 將抽象的數字轉化成具體的編碼 - 編碼對應[存儲字節數、是否變長...]
  • Unicode 的核心就是爲每一個字符提供惟一一個數字編號。code point 例子: 'a' - 97 - 0061 - U+0061(碼點 - 16進制)

具體編碼格式

三種編碼方案的定變長與字節數總結:編碼

  • UTF-8:變長,1-4 字節;
  • UTF-16:變長,2 或 4 字節;
  • UTF-32:定長,4 字節。

定長與變長

  • 在容量 和 效率之間全行,出現了變長的編碼方案。
  • 默認標示位,變長方案。損失了不少有效碼位
  • 出現了代理區 作 區分的 方案

Unicode

  • Unicode 是 Unicode Standard(Unicode標準)的簡寫,因此 Unicode 便是指 Unicode 標準。代理

  • 它脫離具體平臺、語言,給每個字符 一個惟一的數字code--碼點(code point)code

  • 碼點的格式 U+[XX]XXXX X:表明一個十六制數字 能夠有 4-6 位,不足 4 位前補 0 補足 4 位,超過則按是幾位就是幾位。如下是碼點的一些具體示例:U+0048,U+4F60,U+1D11E。最後一個是5位的碼點。orm

  • 範圍[U+0000,U+10FFFF] 理論大小爲 10FFFF+1=110000(16進制)[FFFF+1 轉10進制 = 65536 ]。是一個百萬級別的數。io

  • 平面[Plane]爲了更好分類管理如此龐大的碼點數,把每 65536 個碼點做爲一個平面,總共 (1 x 16 + 1 )= 17 個平面。form

    • first Plane = BMP(Basic Multilingual Plane 基本多語言平面),也叫 Plane 0,它的碼點範圍是 U+0000 ~ U+FFFF
    • 後續的 16 個平面稱爲 SP(Supplementary Planes)。範圍超過了 U+FFFF即超過了 4個byte了。
    • CJK 統一漢字(CJK:Chinese, Japanese, and Korean,中日韓)在first plane 中間很大一片區域
    • 還有一片空白區域--代理區 這段空白從 D8~DF。其中前面的紅色部分 D800–DBFF 屬於高代理區(High Surrogate Area),後面的藍色部分 DC00–DFFF 屬於低代理區(Low Surrogate Area),各自的大小均爲 4×256=1024。
  • UTF 便是 Unicode 轉換格式(Unicode (or UCS) Transformation Format)效率

    • UTF-32
      • 碼點最大的 10FFFF 佔 21 位,UTF-32 採用的定長4 byte 則是 32 位。高位補 0 的形式補夠 32 位便可,缺點佔用空間太大。
      • 4字節 XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
    • UTF-8
      • 變長的編碼方案:1,2,3,4 四種 byte 組合擴展

      • 採用高位保留方式 來區別不一樣變長coding

        • 1字節 0XXX XXXX
        • 2字節 110X XXXX 10XX XXXX
        • 3字節 1110 XXXX 10XX XXXX 10XX XXXX
        • 4字節 1111 0XXX 10XX XXXX 10XX XXXX 10XX XXXX
      • 碼點對應字節二進制

        1. 轉二進制,去掉高位0 判斷採用幾字節
        2. 一字節 有效位7位兼容ASCII [碼點] U+0000 ~ U+007F (0~127)
        3. 二字節 11位有效,2^11=2048 個編碼空間 碼點 U+0080 ~ U+07FF (128~2047)
          • 這裏碼點從 128~2047,由於去掉了一字節的碼點,因此不會佔滿 2048 個編碼空間,是有冗餘的,但你不能把適用於一字節的碼點放到這裏來編碼。下同。
        4. 三字節 16位有效,65536 個編碼空間 碼點U+0800~U+FFFF (2048~65535)
          • 存着絕大部分漢字
        5. 四字節 21位有效,前面說到最大的碼點 10FFFF 也是 21 位,U+FFFF 以上的增補平面的字符都在這裏來表示。
      • 碼點轉換

        1. 將碼點轉換成 2進制
        2. 將二進制數 按照UTF-8 固定位分組
        3. 選中幾字節模式後,高位不足 補0
        4. 從新將 2進制數 轉換成16進制數
      • N 字節模式,首字節以「N 個 1 再加 0 」打頭,後跟「N-1」個以「10」打頭的字節。

    • UTF-16
      • 變長的 2 或 4 字節編碼模式
        • BMP內的字符使用 2 字節編碼
        • 其它的則使用 4 字節組成所謂的代理對來編碼
      • 代理區
        • 鳥瞰圖中,一片空白的區域,就是代理區(Surrogate Area),
        • 爲了編碼增補平面中的字符而保留的,總共有 2048 個位置,均分爲高代理區(D800–DBFF)和低代理區(DC00–DFFF)兩部分,各1024,這兩個區組成一個 二維的表格,共有:1024 × 1024 = 2^10×2^10 = 2^4×2^16 = 16×65536
        • 它剛好能夠表示增補的 16 個平面中的全部字符
      • 碼點轉換
        • BMP 中直接對應,無須作任何轉換
        • 增補平面 SP 中:
          1. 減去10000(16進制)[第一個平面中的全部碼點]
          2. 除以代理區的行寬[ 1024(10進制) ] 商:第幾個高代理區 餘數:第幾個低代理區
          3. Lead = (碼點 – 10000(16)) ÷ 40016 + D800
             Trail = (碼點 – 10000(16) % 40016 + DC00
        • 轉換請用API 經過位移運算更高效
相關文章
相關標籤/搜索