热门问题
时间线
聊天
视角
統一碼二進制有序壓縮
来自维基百科,自由的百科全书
Remove ads
統一碼二進制有序壓縮[1](英語:Binary Ordered Compression for Unicode,縮寫:BOCU)是統一碼技術註解文件所定義的規範[2],可以兼容MIME的統一碼壓縮方案。
![]() |
雖然UTF-8適合廣泛使用,但對於非拉丁文和中日韓統一表意文字的文字,相較於代碼頁技術,它佔用了更多的空間(較高的 "字節 / 碼位" 之比)。另一方面,SCSU 佔用的空間與代碼頁差不多,但卻不相容於MIME。二進制有序壓縮則結合了UTF-8的廣泛適用性和統一碼標準壓縮方案(SCSU)的緊湊性。[2]
這種編碼旨在用於壓縮短字符串,並保持碼點順序。
Remove ads
細節
本章節中使用的數字都是十六進制,且使用的範圍都是包含在內。
統一碼二進位有序壓縮的核心概念在於:同一種語言的字符,通常被放在鄰近位置(同一區段內),所以文件中的一個字符與前一個字符碼值的差值是小的,可以用較少的字節來編碼。
而實際作法上,不是直接使用前一個字符的碼值,而是前一固字符歸一化的碼值,即所在區段的中間值。其對應如下:
此壓縮法的規則為,碼位U+0020
使用其原本的值。其他碼位(即U+0021
到U+D7FF
和U+E000
到U+10FFFF
),則計算其與前一個字符的歸一化版本的碼值差值,並對此差值編碼。
差值的編碼規則如下:
每個位元範圍按字典順序排序,但不包括以下十三個字節值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
不受保護,可以作為尾字節出現。
Remove ads
專利
在美國專利#6,737,994中,涵蓋了通用BOCU算法,同時還提到了特定的BOCU-1實現[4]IBM當時雇用了BOCU-1的兩位發明者,在統一碼技術說明中指出「完全兼容的BOCU-1版本」的實現者必須聯繫 IBM 以申請免版稅許可[5]BOCU-1是統一碼網站上,目前唯一已知的受到智慧財產權限制的統一碼壓縮方案。
相比之下,IBM也為UTF-EBCDIC申請專利,但它選擇使文檔和編碼方案不要求對實施者申請許可證,而是「任何將轉換格式成為UCS標準的一部分,將對他們們免費提供」[6]
參考
另見
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads