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