统一码二进制有序压缩(英语:Binary Ordered Compression for Unicode,缩写:BOCU) 是统一码技术注解文件所定义的规范[1],可以兼容MIME的统一码压缩方案。
虽然UTF-8适合广泛使用,但对于非拉丁文和中日韩统一表意文字的文字,相较于代码页技术,它占用了更多的空间(较高的 "字节 / 码位" 之比)。另一方面,SCSU 占用的空间与代码页差不多,但却不相容于MIME。二进制有序压缩则结合了UTF-8的广泛适用性和统一码标准压缩方案(SCSU)的紧凑性。[1]
这种编码旨在用于压缩短字符串,并保持码点顺序。
细节
本章节中使用的数字都是十六进制,且使用的范围都是包含在内。
统一码二进位有序压缩的核心概念在于:同一种语言的字符,通常被放在邻近位置(同一区段内),所以文件中的一个字符与前一个字符码值的差值是小的,可以用较少的字节来编码。
而实际作法上,不是直接使用前一个字符的码值,而是前一固字符归一化的码值,即所在区段的中间值。其对应如下:
编码范围 | 归一化码值 | 笔记 |
---|---|---|
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+0000
到U+002的
的码位使用其原本的值。其他码位(即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 实现。 [3]IBM当时雇用了 BOCU-1 的两位发明者,在统一码技术说明中指出“完全兼容的 BOCU-1 版本”的实现者必须联系 IBM 以申请免版税许可。 [4]BOCU-1 是统一码网站上,目前唯一已知的受到知识产权限制的统一码压缩方案。
相比之下,IBM 也为UTF-EBCDIC申请专利,但它选择使文档和编码方案不要求对实施者申请许可证,而是“任何将转换格式成为 UCS 标准的一部分,将对他们们免费提供”。 [5]
参考
- ↑ 1.0 1.1 Markus Scherer, Mark Davis. UTN #6: BOCU-1: MIME-COMPATIBLE UNICODE COMPRESSION. 2006-02-04 [2008-05-18].
- ↑ IANA 中 BOCU-1 的注册记录
- ↑ Davis. United States Patent #6,737,994, "Binary-ordered compression for unicode". 2004-05-18 [2008-11-16]. 无效
|subscription=etal
(帮助) - ↑ Markus Scherer, Mark Davis. UTN #6: BOCU-1. 2006-02-04 [2014-02-05].
- ↑ V.S. Umamaheswaran. UTR #16: UTF-EBCDIC. 2002-04-16 [2008-11-16].