La compresión ordenada binaria para Unicode ( BOCU ) es un esquema de compresión Unicode compatible con MIME . BOCU-1 combina la amplia aplicabilidad de UTF-8 con la compacidad del esquema de compresión estándar para Unicode (SCSU). Esta codificación Unicode está diseñada para ser útil para comprimir cadenas cortas y mantiene el orden de los puntos de código. BOCU-1 se especifica en una nota técnica de Unicode. [1]
A modo de comparación, se adoptó SCSU como esquema de compresión Unicode estándar con una relación byte/punto de código similar a las páginas de códigos específicas del idioma . SCSU no se ha adoptado ampliamente, ya que no es adecuado para los tipos de medios de "texto" MIME. Por ejemplo, SCSU no se puede utilizar directamente en correos electrónicos y protocolos similares. SCSU requiere un diseño de codificador complicado para un buen rendimiento. Por lo general, zip , bzip2 y otros algoritmos estándar de la industria compactan cantidades mayores de texto Unicode de manera más eficiente. [2]
Tanto SCSU [3] como BOCU-1 [4] son conjuntos de caracteres registrados por la IANA .
Todos los números en esta sección son hexadecimales y todos los rangos son inclusivos.
Los puntos de código de U+0000
a U+0020
se codifican en BOCU-1 como el valor de byte correspondiente. Todos los demás puntos de código (es decir, U+0021
hasta U+D7FF
y U+E000
hasta U+10FFFF
) se codifican como una diferencia entre el punto de código y una versión normalizada del punto de código codificado más recientemente que no era un espacio ASCII ( U+0020
). El estado inicial es U+0040
. La asignación de normalización es la siguiente:
Rango de códigos | Punto de código normalizado | Notas |
---|---|---|
U+3040 aU+309F | U+3070 | Hiragana |
U+4E00 aU+9FA5 | U+7711 | Unihan |
U+AC00 aU+D7A3 | U+C1D1 | Hangul |
U+0020 | El estado del codificador se mantiene tal cual | Espacio |
U+hhhh00 a (excluyendo los rangos anteriores)U+hhhh7F | U+hhhh40 | mediados de 128 |
U+hhhh80 a (excluyendo los rangos anteriores)U+hhhhFF | U+hhhhC0 | mediados de 128 |
La diferencia entre el punto de código actual y el punto de código anterior normalizado se codifica de la siguiente manera:
Rango de diferencia | Rango de secuencia de bytes (ver abajo) |
---|---|
-10FF9F a-2DD0D | 21 F0 58 D9 a21 FF FF FF |
-2DD0C a-2912 | 22 01 01 a24 FF FF |
-2911 a-41 | 25 01 a4F FF |
-40 a3F | 50 aCF |
40 a2910 | D0 01 aFA FF |
2911 a2DD0B | FB 01 01 aFD FF FF |
2DD0C a10FFBF | FE 01 01 01 aFE 19 B4 54 |
Cada rango de bytes está ordenado lexicográficamente con los siguientes trece valores de bytes excluidos: 00 07 08 09 0A 0B 0C 0D 0E 0F 1A 1B 20
. Por ejemplo, la secuencia de bytes FC 06 FF
, que codifica una diferencia de 1156B
, es seguida inmediatamente por la secuencia de bytes FC 10 01
, que codifica una diferencia de 1156C
.
Cualquier entrada ASCII U+0000
que U+007F
excluya el espacio U+0020
restablece el codificador a U+0040
. Debido a que los valores mencionados anteriormente cubren los puntos de código de fin de línea U+000D
y U+000A
tal como están ( 0D 0A
), el codificador está en un estado conocido al comienzo de cada línea. Por lo tanto, la corrupción de un solo byte afecta como máximo a una línea. A modo de comparación, la corrupción de un solo byte en UTF-8 afecta como máximo a un punto de código; para SCSU , puede afectar a todo el documento.
BOCU-1 ofrece una robustez similar también para textos de entrada sin los valores mencionados anteriormente con el código de reinicio especial 0xFF
. Cuando un decodificador encuentra este octeto, reinicia su estado como U+0040
para un final de línea. El uso de 0xFF
bytes de reinicio no se recomienda en la especificación BOCU-1, porque entra en conflicto con otros objetivos de diseño de BOCU-1, en particular el orden binario .
El uso opcional de una firma U+FEFF
al comienzo de los textos codificados BOCU-1, es decir, la secuencia de bytes BOCU-1 FB EE 28
, cambia el estado inicial U+0040
a U+FEC0
. En otras palabras, la firma no se puede eliminar simplemente como en la mayoría de los demás esquemas de codificación Unicode. Agregar un byte de reinicio después de la firma ( FB EE 28 FF
) podría evitar este efecto, pero la especificación BOCU-1 no recomienda esta práctica.
En teoría, UTF-1 y UTF-8 podrían codificar el conjunto UCS-4 original con 31 bits hasta 7FFFFFFF
. BOCU-1 y UTF-16 pueden codificar el conjunto Unicode moderno de U+0000
a U+10FFFF
. Excluyendo los trece puntos de código protegidos codificados como octetos individuales, BOCU-1 puede usar octetos en codificaciones de múltiples bytes. BOCU-1 necesita como máximo cuatro bytes que consisten en un byte inicial y de uno a tres bytes finales. Los bytes finales codifican una diferencia restante de " módulo 243" (base 243), el byte inicial determina el número de bytes finales y una diferencia inicial. Tenga en cuenta que el byte de reinicio no está protegido y puede aparecer como byte final.0xFF
Antes del 16 de noviembre de 2022, el algoritmo general BOCU estaba cubierto por la patente de los Estados Unidos n.° 6 737 994, que también menciona la implementación específica de BOCU-1. [5] Esta patente ya ha expirado.
IBM , que empleaba a ambos inventores de BOCU-1 en el momento de su creación, declaró en la Nota técnica de Unicode que los implementadores de una "versión totalmente compatible de BOCU-1" tenían que ponerse en contacto con IBM para solicitar una licencia libre de regalías. [6] BOCU-1 es el único esquema de compresión Unicode descrito en el sitio web de Unicode que se sabe que ha estado sujeto a restricciones de propiedad intelectual .
Por el contrario, IBM también solicitó una patente para UTF-EBCDIC , pero en ese caso optó por hacer que la documentación y el esquema de codificación estuvieran "libremente disponibles para cualquier persona interesada en hacer que el formato de transformación sea parte de los estándares UCS", en lugar de exigir a los implementadores que solicitaran una licencia. [7]