跳转到内容

統一碼二進制有序壓縮

维基百科,自由的百科全书

統一碼二進制有序壓縮[1](英語:Binary Ordered Compression for Unicode,縮寫:BOCU)是統一碼技術注解文件所定義的規範[2],可以兼容MIME的統一碼压缩方案。

雖然UTF-8適合廣泛使用,但對於非拉丁文和中日韓統一表意文字的文字,相較於代码页技術,它佔用了更多的空間(較高的 "字節 / 碼位" 之比)。另一方面,SCSU 佔用的空間與代碼頁差不多,但卻不相容於MIME。二進制有序壓縮則结合了UTF-8的廣泛適用性和統一碼標準壓縮方案(SCSU)的紧凑性。[2]

这种编码旨在用于压缩短字符串,并保持码点顺序。

BOCU-1是IANA注册的字符集[3]

细节

本章節中使用的數字都是十六進制,且使用的範圍都是包含在内。

統一碼二進位有序壓縮的核心概念在於:同一種語言的字符,通常被放在鄰近位置(同一區段內),所以文件中的一個字符與前一個字符碼值的差值是小的,可以用較少的字節來編碼。

而實際作法上,不是直接使用前一個字符的碼值,而是前一固字符歸一化的碼值,即所在區段的中間值。其對應如下:

編碼范围 歸一化碼值 笔记
U+3040U+309F U+3070 平假名
U+4E00U+9FA5 U+7711 中日韓統一表意文字
U+AC00U+D7A3 U+C1D1 韩文
U+0020 编码器状态保持原样 空格
U+ hhhh00 U+hhhh7F

(不包括上述范围)

U+hhhh40 中间
共128个
U+hhhh80 U+hhhhFF

(不包括上述范围)

U+hhhhC0 中间
共128个

此壓縮法的規則為,码位U+0020使用其原本的值。其他码位(即U+0021U+D7FFU+E000U+10FFFF ),則計算其與前一個字符的歸一化版本的碼值差值,並對此差值編碼。

差值的編碼規則如下:

差值範圍 字节序列范围
(见下文)
-10FF9F-2DD0D 21 F0 58 D921 FF FF FF
-2DD0C-2912 22 01 0124 FF FF
-2911-41 25 014F FF
-403F 50CF
402910 D0 01FA FF
29112DD0B FB 01 01FD FF FF
2DD0C10FFBF FE 01 01 01FE 19 B4 54

每个位元范围按字典顺序排序,但不包括以下十三个字节值00 07 08 09 0A 0B 0C 0D 0E 0F 1A 1B 20。例如,差值1156B 的編碼,其字節序FC 06 FF。紧接着差值1156C 的編碼,是字节序列FC 10 01 (第三個字節,FF 跳過00 01,而第二個字節,06 跳過07 08 09 0A 0B 0C 0D 0E 0F 10)。

除了空格U+0020為例外,對所有ASCII字符U+0000U+007F,编码器會重置为U+0040。由於上述的按原样包含了行尾码位U+000DU+000A (0D 0A ),因此编码器在每行的开头处于已知状态。因此,单个字节的损坏最多影响一行。相比之下,UTF-8单个字节的损坏最多影响一个字符,对于SCSU来说,則可能會影响整个文档。

對於没有上述值的文本,BOCU-1亦提供了类似的穩健性,带有特殊的重置代码0xFF。当解码器找到这个八位字节时,它会将其状态重置为U+0040就像行尾一样。BOCU-1规范中不推荐使用0xFF复位字节,因为它与其他BOCU-1设计目标相冲突,尤其是二进制顺序

在BOCU-1编码文本的开始处,可選擇地使用签名U+FEFF,其字節串列FB EE 28,會将初始状态由U+0040改U+FEC0。换句话说,無法像其他大多數的統一碼编码方案一样简单地剥离簽名。若額外添加一個復位字節,使之成為字節順序FB EE 28 FF,則可以避免这种影响,但BOCU-1规范不推荐这种做法。

理论上,UTF-1UTF-8可以為原始UCS-4集(使用 31 位元、上到7FFFFFFF)編碼。BOCU-1和UTF-16可以為現代統一碼集(U+0000U+10FFFF)。排除 13 個受保護碼位外,BOCU-1单个位元組可以多字节编码。BOCU-1最多需要四个位元組,包括一个前导字元和一到三个尾端位元組。尾字节编码剩余的“243”(基数 243)差,前导字节确定尾字节数和初始差。请注意,复位字节0xFF不受保护,可以作为尾字节出现。

专利

在美国专利#6,737,994中,涵盖了通用BOCU算法,同時还提到了特定的BOCU-1实现[4]IBM當時雇用了BOCU-1的两位发明者,在統一碼技术说明中指出「完全兼容的BOCU-1版本」的实现者必须联系 IBM 以申请免版税许可[5]BOCU-1是統一碼网站上,目前唯一已知的受到知识产权限制的統一碼压缩方案。

相比之下,IBM也為UTF-EBCDIC申請专利,但它选择使文档和编码方案不要求對實施者申請許可證,而是「任何将轉換格式成为UCS标准的一部分,將對他們們免费提供」[6]

参考

  1. ^ About Unicode Terminology. unicode.org. [2021-12-10]. (原始内容存档于2021-04-21). 
  2. ^ 2.0 2.1 Markus Scherer, Mark Davis. UTN #6: BOCU-1: MIME-COMPATIBLE UNICODE COMPRESSION. 2006-02-04 [2008-05-18]. (原始内容存档于2021-12-08). 
  3. ^ IANA 中BOCU-1的註冊記錄. [2021-11-16]. (原始内容存档于2020-08-11). 
  4. ^ Davis; et al. United States Patent #6,737,994, "Binary-ordered compression for unicode". 2004-05-18 [2022-12-28]. (原始内容存档于2022-12-28). 
  5. ^ Markus Scherer, Mark Davis. UTN #6: BOCU-1. 2006-02-04 [2014-02-05]. (原始内容存档于2021-12-08). 
  6. ^ V.S. Umamaheswaran. UTR #16: UTF-EBCDIC. 2002-04-16 [2008-11-16]. (原始内容存档于2022-01-30). 

另見

  • UTF-1:包含 UTF-1、UTF-8和BOCU-1设计的比较
  • International Components for Unicode:一个可以在BOCU-1和其他Unicode编码之间转换的库