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). 

外部链接