統一碼二進制有序壓縮
統一碼二進制有序壓縮[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).