统一码二进制有序压缩
统一码二进制有序压缩[1](英语:Binary Ordered Compression for Unicode,缩写:BOCU)是统一码技术注解文件所定义的规范[2],可以兼容MIME的统一码压缩方案。
虽然UTF-8适合广泛使用,但对于非拉丁文和中日韩统一表意文字的文字,相较于代码页技术,它占用了更多的空间(较高的 "字节 / 码位" 之比)。另一方面,SCSU 占用的空间与代码页差不多,但却不相容于MIME。二进制有序压缩则结合了UTF-8的广泛适用性和统一码标准压缩方案(SCSU)的紧凑性。[2]
这种编码旨在用于压缩短字符串,并保持码点顺序。
细节
本章节中使用的数字都是十六进制,且使用的范围都是包含在内。
统一码二进位有序压缩的核心概念在于:同一种语言的字符,通常被放在邻近位置(同一区段内),所以文件中的一个字符与前一个字符码值的差值是小的,可以用较少的字节来编码。
而实际作法上,不是直接使用前一个字符的码值,而是前一固字符归一化的码值,即所在区段的中间值。其对应如下:
编码范围 | 归一化码值 | 笔记 |
---|---|---|
U+3040 至U+309F
|
U+3070
|
平假名 |
U+4E00 至U+9FA5
|
U+7711
|
中日韩统一表意文字 |
U+AC00 至U+D7A3
|
U+C1D1
|
韩文 |
U+0020
|
编码器状态保持原样 | 空格 |
U+ hhhh00 U+hhhh7F
(不包括上述范围) |
U+hhhh40
|
中间 共128个 |
U+hhhh80 U+hhhhFF
(不包括上述范围) |
U+hhhhC0
|
中间 共128个 |
此压缩法的规则为,码位U+0020
使用其原本的值。其他码位(即U+0021
到U+D7FF
和U+E000
到U+10FFFF
),则计算其与前一个字符的归一化版本的码值差值,并对此差值编码。
差值的编码规则如下:
差值范围 | 字节序列范围 (见下文) |
---|---|
-10FF9F 到-2DD0D
|
21 F0 58 D9 到21 FF FF FF
|
-2DD0C 到-2912
|
22 01 01 到24 FF FF
|
-2911 至-41
|
25 01 至4F FF
|
-40 至3F
|
50 到CF
|
40 至2910
|
D0 01 到FA FF
|
2911 至2DD0B
|
FB 01 01 到FD FF FF
|
2DD0C 至10FFBF
|
FE 01 01 01 至FE 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+0000
到U+007F
,编码器会重置为U+0040
。由于上述的按原样包含了行尾码位U+000D
和U+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-1和UTF-8可以为原始UCS-4集(使用 31 位元、上到7FFFFFFF
)编码。BOCU-1和UTF-16可以为现代统一码集(U+0000
到U+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]
参考
- ^ About Unicode Terminology. unicode.org. [2021-12-10]. (原始内容存档于2021-04-21).
- ^ 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).
- ^ IANA 中BOCU-1的註冊記錄. [2021-11-16]. (原始内容存档于2020-08-11).
- ^ Davis; et al. United States Patent #6,737,994, "Binary-ordered compression for unicode". 2004-05-18 [2022-12-28]. (原始内容存档于2022-12-28).
- ^ Markus Scherer, Mark Davis. UTN #6: BOCU-1. 2006-02-04 [2014-02-05]. (原始内容存档于2021-12-08).
- ^ V.S. Umamaheswaran. UTR #16: UTF-EBCDIC. 2002-04-16 [2008-11-16]. (原始内容存档于2022-01-30).