跳至內容

UTF-16的八位元相容編碼方案

維基百科,自由的百科全書

UTF-16的八位元相容編碼方案(英語:Compatibility Encoding Scheme for UTF-16: 8-Bit),簡稱 CESU-8 ,是統一碼技術報告 #26 中描述UTF-8的變體[1]

CESU-8 的設計,是為了能在八位元的計算環境中,提供 UTF-16 的定序。因此,報告中也明確指出,只建議用在那些需要 UTF-16 定序,不預期且不建議用於外部數據交換

CESU-8 有以下特點:

  • 基本多語言平面中的字符編碼會與 UTF-8 相同,只有 增補字符會不同。
  • 只有六個字節形式的增符字符是合規的,UTF-8 中的四字節形式是不合規的。
  • 以 CESU-8 編碼後的字節串列以二進位方式定序,會與 UTF-16 編碼過的字節串列以二進位定序,其結果是一樣。

基本多語言平面中的字符碼位(即 U+0000 到 U+FFFF 範圍內的碼位),其編碼方式與 UTF-8 相同。 增補字符(即 U+10000 到 U+10FFFF 範圍內的碼位),則先以同UTF-16的方式轉為代理對,然後以 UTF-8 的方式將代理對中的每個代碼進行編碼。因此,對於每個統一碼增補字符,CESU-8 需要六個字節(每個代理項 3 個字節),而 UTF-8 只需要四個字節。雖然技術報告中沒有具體說明,但未配對的代理項也會編碼成為 3 個字節。非基本多文種平面的字符會被編碼成11101101 1010yyyy 10xxxxxx 11101101 1011xxxx 10xxxxxx (yyyy 表示字符的前五位減一)。字節值 0xF0 不會出現在 CESU-8 中,因為它開始了 UTF-8 使用的 4 字節編碼。

W3C [2] [3]WHATWG [4] HTML標準禁止在HTML文檔中支援 CESU-8,因為這會導致跨網站腳本漏洞。 [5]

Java 的UTF-8修改版是 CESU-8,並將 NUL 字符 (U+0000) 的特殊超長編碼,作為兩字節序列C0 80[6]

Oracle 數據庫使用 CESU-8 作為其「UTF8」字符集。若要使用標準 UTF-8 ,自 Oracle 9.0 版起,可以使用字符集「AL32UTF8」。

CESU-8 是IANA註冊的字符集[7]

範例

碼位 U+0045 U+0205 U+10400
字符 E ȅ 𐐀
UTF-8 45 C8 85 F0 90 90 80
UTF-16 0045 0205 D801 DC00
CESU-8 45 C8 85 ED A0 81 ED B0 80

參考

  1. ^ McGowan, Rick. Unicode Technical Report #26 - Compatibility Encoding Scheme for UTF-16: 8-Bit (CESU-8). Unicode Consortium. [2021-11-17]. (原始內容存檔於2021-12-08). 
  2. ^ 8.2.2.3. Character encodings. HTML 5.1 Standard. W3C. [2021-11-17]. (原始內容存檔於2021-07-18). 
  3. ^ 8.2.2.3. Character encodings. HTML 5 Standard. W3C. [2021-11-17]. (原始內容存檔於2019-07-03). 
  4. ^ 12.2.3.3 Character encodings. HTML Living Standard. WHATWG. [2021-11-17]. (原始內容存檔於2022-01-07). 
  5. ^ <meta> - HTML. MDN Web Docs. Mozilla. [2021-11-17]. (原始內容存檔於2022-01-14). 
  6. ^ Java SE documentation for Interface java.io.DataInput, subsection on Modified UTF-8. Oracle Corporation. 2015 [2021-04-30]. (原始內容存檔於2021-11-03). 
  7. ^ IANA 的 CESU-8 註冊記錄. [2021-11-17]. (原始內容存檔於2020-09-21). 

外部連結