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”。
範例
碼位 | 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 |
参考
- ^ McGowan, Rick. Unicode Technical Report #26 - Compatibility Encoding Scheme for UTF-16: 8-Bit (CESU-8). Unicode Consortium. [2021-11-17]. (原始内容存档于2021-12-08).
- ^ 8.2.2.3. Character encodings. HTML 5.1 Standard. W3C. [2021-11-17]. (原始内容存档于2021-07-18).
- ^ 8.2.2.3. Character encodings. HTML 5 Standard. W3C. [2021-11-17]. (原始内容存档于2019-07-03).
- ^ 12.2.3.3 Character encodings. HTML Living Standard. WHATWG. [2021-11-17]. (原始内容存档于2022-01-07).
- ^ <meta> - HTML. MDN Web Docs. Mozilla. [2021-11-17]. (原始内容存档于2022-01-14).
- ^ Java SE documentation for Interface java.io.DataInput, subsection on Modified UTF-8. Oracle Corporation. 2015 [2021-04-30]. (原始内容存档于2021-11-03).
- ^ IANA 的 CESU-8 註冊記錄. [2021-11-17]. (原始内容存档于2020-09-21).