Двоичное упорядоченное сжатие для Юникода ( BOCU ) — это MIME- совместимая схема сжатия Юникода. BOCU-1 сочетает в себе широкую применимость UTF-8 с компактностью стандартной схемы сжатия для Unicode (SCSU). Эта кодировка Unicode предназначена для сжатия коротких строк и поддерживает порядок кодовых точек. BOCU-1 указан в Техническом примечании Unicode. [1]
Для сравнения SCSU был принят в качестве стандартной схемы сжатия Unicode с соотношением байт/кодовая точка, аналогичным кодовым страницам для конкретного языка . SCSU не получил широкого распространения, поскольку не подходит для «текстовых» типов мультимедиа MIME. Например, SCSU нельзя использовать непосредственно в электронной почте и подобных протоколах. Для обеспечения хорошей производительности SCSU требуется сложная конструкция кодера. Обычно zip , bzip2 и другие стандартные алгоритмы более эффективно сжимают большие объемы текста в Юникоде. [2]
И SCSU [3] , и BOCU-1 [4] являются зарегистрированными кодировками IANA .
Все числа в этом разделе являются шестнадцатеричными , и все диапазоны включаются.
Кодовые точки от U+0000
до U+0020
кодируются в BOCU-1 как соответствующее значение байта. Все остальные кодовые точки (то есть U+0021
до U+D7FF
конца ) кодируются как разница между кодовой точкой и нормализованной версией самой последней кодированной точки, которая не была пространством ASCII ( U+E000
) . Исходное состояние . Отображение нормализации выглядит следующим образом:U+10FFFF
U+0020
U+0040
Разница между текущей кодовой точкой и нормализованной предыдущей кодовой точкой кодируется следующим образом:
Каждый диапазон байтов упорядочен лексикографически, за исключением следующих тринадцати байтовых значений: 00 07 08 09 0A 0B 0C 0D 0E 0F 1A 1B 20
. Например, за последовательностью байтов FC 06 FF
, кодирующей разницу 1156B
, сразу следует последовательность байтов FC 10 01
, кодирующая разницу 1156C
.
Любой ввод ASCII U+0000
для U+007F
исключения пробела U+0020
сбрасывает кодировщик на U+0040
. Поскольку вышеупомянутые значения охватывают конечные кодовые точки строки U+000D
и U+000A
как есть ( 0D 0A
), кодер находится в известном состоянии в начале каждой строки. Таким образом, повреждение одного байта затрагивает не более одной строки. Для сравнения, повреждение одного байта в UTF-8 влияет не более чем на одну кодовую точку, а в SCSU — на весь документ.
BOCU-1 обеспечивает аналогичную надежность и для входных текстов без вышеупомянутых значений со специальным кодом сброса 0xFF
. Когда декодер находит этот октет, он сбрасывает свое состояние на U+0040
состояние конца строки. Использование 0xFF
байтов сброса не рекомендуется в спецификации BOCU-1, поскольку это противоречит другим целям проектирования BOCU-1, особенно двоичному порядку .
Необязательное использование подписи U+FEFF
в начале закодированных BOCU-1 текстов, т.е. последовательности байтов BOCU-1 FB EE 28
, меняет исходное состояние U+0040
на U+FEC0
. Другими словами, подпись нельзя просто удалить, как в большинстве других схем кодирования Unicode. Добавление байта сброса после подписи ( FB EE 28 FF
) могло бы избежать этого эффекта, но спецификация BOCU-1 не рекомендует такую практику.
Теоретически UTF-1 и UTF-8 могут кодировать исходный набор UCS-4 с 31 битом до 7FFFFFFF
. BOCU-1 и UTF-16 могут кодировать современный набор Unicode от U+0000
до U+10FFFF
. За исключением тринадцати защищенных кодовых точек, закодированных как одиночные октеты, BOCU-1 может использовать октеты в многобайтовых кодировках. BOCU-1 требуется не более четырех байтов, состоящих из ведущего байта и одного-трех завершающих байтов. Байты следа кодируют оставшуюся разницу « по модулю 243» (по основанию 243), ведущий байт определяет количество байтов следа и начальную разницу. Обратите внимание, что байт сброса не защищен и может использоваться как следовой байт.0xFF
До 16 ноября 2022 года общий алгоритм BOCU был описан в патенте США № 6737994, в котором также упоминается конкретная реализация BOCU-1. [5] Срок действия этого патента истек.
IBM , в которой работали оба изобретателя BOCU-1 на момент его создания, заявила в Техническом примечании к Unicode, что разработчики «полностью совместимой версии BOCU-1» должны были связаться с IBM, чтобы запросить бесплатную лицензию. [6] BOCU-1 — единственная схема сжатия Unicode, описанная на веб-сайте Unicode, которая, как известно, обременена ограничениями интеллектуальной собственности .
Напротив, IBM также подала заявку на патент на UTF-EBCDIC , но в этом случае решила сделать документацию и схему кодирования «свободно доступными для всех, кто заинтересован в том, чтобы сделать формат преобразования частью стандартов UCS», вместо того, чтобы требовать от разработчиков. запросить лицензию. [7]