Binary Ordered Compression for Unicode

Binary Ordered Compression for Unicode

Le BOCU-1 est un schéma de transformation du texte, compatible avec le répertoire universel dUnicode et ISO/CEI 10646, en séquences doctets. Il tire son nom de lacronyme anglais de Binary Ordered Compression for Unicode (« compression ordonnée binairement pour Unicode »), qui décrit une méthode brevetée de codage plus générale, et dont BOCU-1 est une des variantes possibles ; cette variante est standardisée de façon très stricte (de façon bien plus limitative que la méthode de codage BOCU qui a dautres applications que le seul codage du texte) et réutilisable sous cette forme dans des applications libres (sous certaines réserves concernant certaines modifications qui restent interdites sans lobtention préalable dune autorisation et dune licence spécifiques si ces modifications ne sont pas strictement conformes à la spécification de cette seule variante).

Comme UTF-8, BOCU-1 est compatible avec MIME et les formats de fichiers texte usuels, car il laisse les codes de contrôle C0 essentiels (utilisés comme séparateurs de ligne ou de page) ainsi que les blancs (espaces normales et tabulations) codés sous forme doctets simples qui ne servent pas non plus à représenter dautres caractères multi-octets. Et comme UTF-8 (mais pas UTF-16 ou SCSU), il conserve au niveau binaire lordre de tri des valeurs scalaires des points de code. Cependant BOCU-1 nest pas utilisable tel quel pour coder les noms de documents et dossiers (dans les systèmes de fichiers), ni dans les URLs.

Sommaire

Intérêts

Son intérêt par rapport à UTF-8 (dans son utilisation pour MIME) réside dans la meilleure compression de données quil permet sans nécessiter dalgorithme compliqué de traitement : il offre un taux de compression comparable à UTF-8 pour les langues latines (anglais, français, allemand, roumain, suédois, tchèque, etc.). Il offre des taux de compression comparables à UTF-16 (et bien meilleur quUTF-8) pour les langues à écriture idéographique (notamment le chinois, le japonais) ainsi que pour le coréen (dans lécriture alphasyllabure hangul).

Comme UTF-8, UTF-16BE, UTF-16LE, UTF-32BE, UTF-32LE (mais à linverse de SCSU, ou même UTF-16 et UTF-32 qui sont dépendant de lordonnancement des octets dans les unités de codage sur 16 ou 32 bits et de la présence ou non dun code « BOM », de langlais Byte Order Mark, en tête de texte), il est totalement prédictif (il nexiste quune seule façon de coder en séquences doctets une même séquence de points de code composant un texte).

Mais par rapport à UTF-8 et UTF-16, il améliore la compression du coréen transcrit seulement dans lalphabet jamo de base.

Il offre un meilleur taux de compression (comparable à celui offert par SCSU) quUTF-8 et bien meilleur quUTF-16 pour les langues utilisant dautres écritures qui utilisent la plupart du temps un nombre réduit de caractères, pris soit dans un même bloc de 128 points de code, soit parmi les codes de contrôles C0 et lespace standard, en obtenant des taux également comparables aux codes des pages de codes et jeux de caractères 8 bits ou multioctets qui ont été développés dans le passé pour certaines langues ou familles de langues, tout en permettant dêtre compatible avec la totalité du répertoire universel de lUCS. Cest le cas de toutes les écritures alphabétiques simples, notamment lécriture grecque (pour la transcription du grec moderne monotonique ou lancien grec classique, mais aussi pour le grec polytonique), cyrillique (pour la transcription du russe, bulgare, ukrainien, etc.), ou les abjads sémitiques (arabe, hébreu), et la plupart des abugidas brahmiques (comme la dévanagari pour la transcription de lhindi ou du sanscrit, lécriture tamoule, les écritures thaïe, khmère, lao, les écritures philippines, etc.)

Principes de codage

Le codage BOCU-1 est contextuel et orienté vers le codage en suite doctets indivis. Il nutilise quune seule variable détat entière (contenant la valeur scalaire dun point de code unique dépendant seulement dun seul point de code précédemment encodé, donc limité à 21 bits).

Il ne doit être utilisé que pour coder sous la forme de séquences doctets des suites de points de codes standards dotés dune valeur scalaire dans les normes ICO/CEI 10646 et Unicode (donc uniquement dans U+0000 à U+D7FF, ou U+E000 à U+10FFFF). Comme les autres schémas de transformations conformes à Unicode (tels que UTF-8), il autorise le codage des non-caractères (tels que U+FFFE..U+FFFF) et uniquement ceux-ci (contrairement au codage GB-18030 utilisé en République populaire de Chine, et qui permet de coder aussi la totalité des points de code standards de lUCS, mais qui contient aussi des extensions permettant, temporairement, de représenter des caractères non encore normalisés dans lUCS au plan international au moyen dun nombre plus important de positions dusage privé dans leur mappage possible vers lUCS, mais réservées dans un registre permanent au sein de cette norme nationale).

La variable détat

La variable détat prend une valeur initiale fixe, qui est restaurée après chaque occurrence dun caractère de contrôle C0 dans le texte (U+0000 à U+001F) et qui correspond au milieu de la colonne des 128 caractères de lUS-ASCII : U+0040.

Lencodage BOCU dun nouveau point de code dépend de celui-ci :

  1. Si ce nouveau point de code est le caractère dune espace normale, U+0020, loctet 0x20 est émis, mais la variable détat nest pas modifiée.
  2. Si ce nouveau point de code est celui dun des douze caractères de contrôle invariants nécessaires pour la compatibilité MIME (listés dans la section suivante), loctet de même valeur scalaire est émis, et la variable détat prend la valeur U+0040 (au milieu du bloc latin de base: cela permet une resynchronisation du flux sur les sauts de lignes.
  3. Sinon, ce nouveau point de code est codé avec une longueur variable sur un à quatre octets (mais sans utiliser aucun des douze octets invariants réservés pour MIME, ni loctet 0x20 représentant lespace U+0020), calculés selon la différence delta entre les valeurs scalaires de ce nouveau point de code et de celui stocké dans la variable détat.

La variable détat nest pas modifiée après le codage dune espace (U+0020), afin de ne pas briser le taux de compression dans les textes non latins les plus courants (ce nétait pas le cas dans la version initiale appelée simplement « BOCU » par ses concepteurs, et que la version BOCU-1 référencée par la note technique UTN#6 dUnicode a améliorée sur ce point).

Dans tous les autres cas, la variable détat prend la valeur dun point de code au milieu du bloc dans lequel se situe le dernier caractère qui a été encodé. Des exceptions sont faites pour les écritures nécessitant des blocs plus larges ou non alignés sur des multiples de 128 points de code :

  1. après le codage un caractère du bloc hiragana (U+3040 à U+309F), la variable détat prend la valeur du point de code au milieu de ce bloc (U+3070).
  2. après le codage dun caractère sinographique du bloc CJK Unihan (U+4E00 à U+9FA5), la variable détat prend la valeur du point de code au milieu de ce bloc (U+76D2).
  3. après le codage dun caractère du bloc des syllabes hangul précomposées (U+AC00 à U+D7A3), la variable détat prend la valeur du point de code au milieu de ce bloc (U+C1D1).
  4. dans les autres cas, la variable détat prend la valeur du dernier point de code, arrondie au multiple de 128 inférieur puis auquel on ajoute 64.

Points de codes codés de façon invariante et synchronisation

Les douze caractères de contrôle invariants pour MIME, et qui sont toujours codés avec le même octet quels que soit leur position dans le texte sont :

  • U+0000, codé 0x00 dans BOCU-1 : le caractère de bourrage (null, abrégé NUL) ;
  • U+0007, codé 0x07 dans BOCU-1 : le caractère dalarme (bell, abrégé BEL) ;
  • U+0008, codé 0x08 dans BOCU-1 : lespace de correction arrière (backspace, abrégé BS) ;
  • U+0009, codé 0x09 dans BOCU-1 : la tabulation horizontale (tabulation, abrégé TAB) ;
  • U+000A, codé 0x0A dans BOCU-1 : le saut de ligne (line feed, abrégé LF) ;
  • U+000B, codé 0x0B dans BOCU-1 : la tabulation verticale (vertical tabulation, abrégé VT) ;
  • U+000C, codé 0x0C dans BOCU-1 : le saut de page (form feed, abrégé FF) ;
  • U+000D, codé 0x0D dans BOCU-1 : le retour chariot (carriage return, abrégé CR) ;
  • U+000E, codé 0x0E dans BOCU-1 : le contrôle de sortie hors-code (shift out, abrégé SO) ;
  • U+000F, codé 0x0F dans BOCU-1 : le contrôle de retour en-code (shift in, abrégé SI) ;
  • U+001A, codé 0x1A dans BOCU-1 : le contrôle de substitution (substitute, abrégé SUB), également utilisé dans les fichiers textes compatibles DOS et CPM comme marqueur de fin de fichier ;
  • U+001B, codé 0x1B dans BOCU-1 : le contrôle déchappement (escape, abrégé ESC) ;

(Ces douze caractères de contrôle sajoutent à lespace normale U+0020 codée 0x20 et décrite ci-dessus, qui est aussi invariante mais ne déclenche pas de réinitialisation de la variable détat et ne peut donc pas servir à la resynchronisation du flux).

Les 20 autres caractères de contrôle C0, bien que codés aussi eux-mêmes en utilisant un seul octet de valeur scalaire identique (afin de préserver lordre de tri binaire), sont aussi utilisés comme octets suffixe dans la représentation différencielle des autres caractères.

On peut noter que certains protocoles de transport ou protocoles de liaison pour le transport de données (y compris le texte) utilisent dautres caractères de contrôle pour lencapsulation de données dans des trames (notamment U+0002 [STX] et U+0003 [ETX] et U+0016 [SYN]), le contrôle de flux (notamment U+0011 [DC1/XON] et U+0014 [DC4/XOFF]), lacquittement (hors-bande) de commandes (notamment U+0006 [ACK] et U+0015 [NAK]), le bourrage (notamment U+007F [DEL]), lannulation anticipée dune séquence ou commande en cours non acquittée (U+0018 [CAN]), et la transparence des données encapsulées (notamment avec U+0010 [DLE]).
Ces contrôles ne sont pas préservés (mais réencodés différemment à laide des valeurs deltas décrites ci-dessous) dans BOCU-1 qui sera incompatible avec ces protocoles (qui disposent parfois de dispositifs déchappement permettant de transporter ces caractères de façon transparente, mais nécessitant lemploi dun des contrôles susmentionnés). La plupart de ces protocoles sont aujourdhui désuets et remplacés par des protocoles assurant une totale transparence des données encapsulées à laide de codages binaires plus efficaces (par exemple les protocoles de transport TCP/IP de lInternet ou les trames compatibles Ethernet des normes IEEE 802).

À ces valeurs doctets fixes sajoute une valeur réservée qui ne représente elle-même aucun point de code et ne peut figurer non plus comme premier octet du séquence multi-octet représentant un point de code :

  • la valeur doctet 0xFF est réservée comme code reset spécial pour la resynchronisation (il ne sera codé que pour forcer la variable détat à sa valeur initiale U+0040 : cela brise effectivement lordonnancement binaire des points de code (cet octet ne représentera donc pas un caractère) ;
  • il peut être utilisé comme terminateur de texte ou comme séparateur de clés de tri textuelles puisquil est supérieur à tous les autres octets utilisés pour le codage des points de code, mais il ne pourra pas être utilisé comme octet préfixe au milieu dun texte codé BOCU sans briser le tri binaire) ;
  • mais cette valeur pourra être utilisée aussi pour les octets suffixes servant à coder les grandes valeurs de deltas sur plusieurs octets (voir ci-dessous).

Codage différentiel des autres points de code

Le codage différentiel des autres points de code dotés dune valeur scalaire (caractères ou non-caractères) doit permettre de coder distinctement des différences positives ou négatives entre tout point de code possible et celui contenu dans la variable détat : les petites différences (valeurs de delta positives ou négatives) nécessitent moins doctets que les grandes différences.

Parmi ces différences, celles dans lintervalle delta de -64 à +63 ne nécessitent quun seul octet, alors que les différences plus grandes sont représentées par un octet préfixe discriminant, indiquant la longueur de la séquence totale, suivi de un ou plusieurs octets de suffixe.

Table résumée de codage des deltas (en hexadécimal)
Delta minimum Delta maximum Séquence doctets minimum Séquence doctets maximum
-10FF9F -2DD0D 21 F0 5A 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

Dans la table ci-dessus, les premiers octets dune séquence (octets de préfixe discriminants) sont indiqués en gras comme dans le reste de cet article. Les octets de suffixe varient de 0x01 à 0xFF mais ne peuvent pas prendre toutes les valeurs possibles : les 13 valeurs doctet réservées aux caractères de contrôle invariants et à lespace sont exclues de ce codage (qui utilise un système numéral de base 243 avant de mapper les chiffres de ce système sur les valeurs doctets autorisées).

Le détail de ce codage, sur la façon dont il a été déterminé et finalement utilisé, est expliqué dans les sous-sections qui suivent.

Représentation des petits deltas sur un seul octet

Sachant que tous les caractères de contrôle C0 (U+0000 à U+001F) et lespace U+0020 sont codés aussi par un octet unique, et quun octet est réservé pour la fonction de synchronisation ou de marque de fin de texte, cela laisse 222 valeurs doctets possibles dans un intervalle continu (de 0x21 à 0xFE) pour coder les petits deltas avec un octet unique, et pour coder les octets de préfixe discriminants des plus grands deltas.

La valeur doctet médiane de cet intervalle est 0x90, qui sera utilisée pour coder un delta nul (cest-à-dire pour encoder un point de code égal à celui dans la variable détat).

Les petits deltas de -64 à +63 seront codés relativement à cette valeur doctet, donc avec les valeurs doctet entre 0x50 et 0xCF.

Autres valeurs de delta possibles codées sur plusieurs octets, et octets utilisables

Dans BOCU-1, les valeurs doctets suffixes ne sont pas séparées des valeurs doctets préfixes, mais les deux types excluent les douze valeurs doctets réservées aux caractères de contrôle invariants et à lespace (U+0020).

Sachant que les douze caractères de contrôle C0 invariants (U+0000, U+0007 à U+000F, U+001A et U+001B) et lespace U+0020 ne sont jamais utilisés non plus comme octets de suffixe (pour préserver la compatibilité MIME), cela laisse 243 valeurs possibles (de 0x01 à 0x06, de 0x10 à 0x19, et de 0x1C à 0x1F et de 0x21 à 0xFF) pour le (ou les) octet(s) de suffixe utilisés (après un premier octet de préfixe discriminant) pour coder les valeurs plus grandes (négatives ou positives) de deltas sur plusieurs octets.

Les valeurs de deltas sont codées de sorte que les octets uniques et les octets de préfixe sont ordonnées de la valeur des deltas négatifs la plus grande en valeur absolue à la valeur des deltas positifs les plus grands.

  • Ces valeurs de delta nétant pas utilisées pour coder les points de code U+0000 à U+0020, les deltas ne sont utilisés que pour coder les points de code U+0021 à U+10FFFF (sauf le petit segment U+D800 à U+DFFF des demi-codets qui n'ont pas de valeur scalaire et dont le codage est interdit pour la conformité à Unicode).
  • Les valeurs possibles de la variable détat ne peuvent être comprises quentre U+0040 (valeur initiale ou de resynchronisation après le codage dun des douze caractères de contrôle C0 invariants) et U+10FFC0.
  • Les valeurs possibles de delta codés sur plusieurs octets ne peuvent donc être comprises que :
    • entre (0x21 - 0x10FFC0) = -0x10FF9F = -1 114 015 et -65 (soit 1 113 951 valeurs négatives) ; ou bien
    • entre +64 et (0x40 - 0x10FFFF-0x40) = +0x10FFBF = +1 114 047 (soit 1 113 984 valeurs positives).

Pour coder ces grands deltas sur plusieurs octets, on utilisera un octet de préfixe discriminant parmi :

  • les 47 valeurs doctets entre 0x21 et 0x4F (pour les deltas négatifs inférieurs à -64, du plus grand négatif au moins négatif)
  • les 47 valeurs doctets entre 0xD0 et 0xFE (pour les deltas positifs supérieurs à +63, du moins positif au plus grand positif)

et un ou plusieurs octets de suffixe parmi :

  • les 20 valeurs doctets non invariants dans les codes de contrôles C0 : de 0x01 à 0x06, de 0x10 à 0x19, de 0x1C à 0x1F.
  • les autres 223 valeurs doctets de 0x21 à 0xFF.
Répartition des octets de préfixe

Indépendamment du signe des deltas, on a 47 valeurs doctets de préfixe disponibles et 243 valeurs doctets de suffixe, pour coder jusquà 1 113 823 valeurs négatives et 1 113 984 valeurs positives de delta.

  • Les séquences codées sur 2 octets permettent donc de coder 243 valeurs de deltas par octet de préfixe utilisé
  • Les séquences codées sur 3 octets permettent de coder 2432 = 59 049 valeurs de delta par octet de préfixe utilisé
  • Les séquences codées sur 4 octets permettent de coder jusquà 2433 = 14 348 907 valeurs de delta (bien plus que nécessaire pour la totalité).

Pour obtenir la compression maximale, on a intérêt à maximiser les codes les plus courts en utilisant le plus possible de séquences sur 2 octets pour les valeurs de deltas les plus faibles et les plus probables :

  • 43 des 47 valeurs doctets préfixes(entre 0x25 et 0x4F) pour les delta négatifs permettent de coder 43 * 243 = 10 449 valeurs (entre -10 513 et -65) ;
  • 43 des 47 valeurs doctets préfixes (entre 0xD0 et 0xFA) pour les delta positifs permettent de coder 43 * 243 = 10 449 valeurs (entre +64 et +10 512).

Les séquences codées sur 3 octets utilisent :

  • 3 des 47 valeurs doctets préfixes (entre 0x22 et 0x24) pour les delta négatifs permettent de coder 3 * 2432 = 177 147 valeurs (entre -187 660 et -10 514) ;
  • 3 des 47 valeurs doctets préfixes (entre 0xFB et 0xFD) pour les delta positifs permettent de coder 3 * 2432 = 177 147 valeurs (entre +10 513 et +187 659).

Les séquences codées sur 4 octets utilisent :

  • 1 des 47 valeurs doctets préfixes (0x21) pour les delta négatifs permettent de coder toutes les autres (entre -1 114 015 et -187 661) ;
  • 1 des 47 valeurs doctets préfixes (0xFE) pour les delta négatifs permettent de coder toutes les autres (entre +187 660 et +1 114 047) ;

La totalité des points de code ayant une valeur scalaire dans lUCS peut donc être encodé sous cette forme compressée tout en conservant leur ordre binaire relatif.

Notes :
Environ 6,46% seulement de toutes les séquences possibles sur 4 octets (2433 = 14 348 907) sont utilisées (les dernières possibles pour les valeurs de delta négatives, et les premières possibles pour les valeurs de delta positives), pour chacune des deux valeurs doctet préfixe 0x21 et 0xFF.
  1. De même que la séquence spéciale de synchronisation forcée, codée par loctet unique 0xFF, aurait pu être codée parmi les valeurs de delta résiduelles sous forme dune séquence multi-octets parmi celles inutilisées à la fin de la plage positive, et cette valeur doctet 0xFF aurait alors pu être utilisée aussi comme octet préfixe discriminant pour des séquences plus courtes permettant détendre certaines plages de valeurs de delta codées sur des séquences plus courtes.
    • Mais cela naurait pas suffit à éviter des séquences de 4 octets qui sont nécessaires pour coder les plus de 900 000 deltas positifs et presque autant de deltas négatifs nécessaires.
    • Toutefois, cela aurait permis de coder deux points de code supplémentaires (de façon semblable à lespace) sur un seul octet dautres caractères de contrôle C0 à garder invariant, par exemple [DEL] U+007F pour une compatibilité améliorée avec les protocoles qui l'interprètent comme un caractère de bourrage).
  2. Pour disposer dune représentation de longueur variable sur au maximum 4 octets de toutes les valeurs de delta nécessaires à la représentation de la totalité de lUCS, il suffit en effet de disposer de seulement 104 valeurs doctets suffixes (au lieu des 243 utilisées dans BOCU-1), non utilisées par les caractères codés sur un seul octet invariant. Le choix de 243 valeurs doctets variables permet de maximiser la compression uniquement en fonction de lobjectif de compatibilité avec MIME uniquement (compatible avec les jeux sur 8 bits) mais pas avec tous les protocoles (et notamment pas les protocoles sur 7 bits, ni ceux qui demandent la préservation du codage US-ASCII).
    • Une représentation totalement compatible avec ISO 8859 (préservant le codage de lUS-ASCII et aussi les contrôles C1) naurait laissé que 96 valeurs doctets pour coder les séquences de longueurs variable, et il aurait fallu soit étendre les séquences de delta en les autorisant à atteindre jusqu'à 5 octets de code (et utiliser alors une base dau minimum 33 valeurs doctets, parmi ces 96, pour les octets suffixes) ; pour limiter les séquences à 4 octets maximum, il est nécessaire dautoriser les séquences variables représentant les valeurs deltas à réutiliser 104 des 160 valeurs doctets de lISO 8859, mais uniquement comme valeurs de codes suffixes (et non de codes préfixes ou codes uniques: parmi ces 104 il faudrait nécessairement inclure au minimum 8 des valeurs doctets codant les contrôles C1.
    • IBM a ainsi développé des adaptations du codage plus général BOCU (différent de la variante BOCU-1 présentée ici) pour la compatibilité avec EBCDIC (en préservant les contrôles C0 et lespace U+0020, codé 0x40 dans EBCDIC, ainsi que la plupart des contrôles C1: pour cela, la base de 243 octets variables a été réduite.
  3. Parmi les séquences de 4 octets utilisées dans BOCU-1, celles servant à coder les plus grandes valeurs négatives possibles de delta ne peuvent servir quà encoder des points de code du jeu US-ASCII (U+0000 à U+007F), et seulement quand la variable détat est à sa valeur maximale (U+10FFC0, après lencodage d'un point de code du 17e et dernier plan dusage privé). Ces séquences sont toujours codées sur 4 octets, et commencent toujours par loctet préfixe 0x21, qui est suivi du premier octet suffixe constant 0xF0, du second octet suffixe valant seulement 0x5A ou 0x5B, et dun troisième octet suffixe.
    • Le remplacement de ces séquences par lallocation d'un intervalle de valeurs doctets pour le premier octet suffixe (après loctet préfixe 0x21) aurait permis de conserver un codage sur 2 octets dune partie significative du jeu US-ASCII (par exemple tous les contrôles C0, les ponctuations et les 10 chiffres, parmi les points de code inférieurs à U+0040) voire la totalité de ce jeu, quelle que soit la valeur de la variable d'état (alors quun codage sur 2 octets de ces points de code ne sera possible que si la variable détat ne contient pas un point de code trop grand).
    • Sachant que 13 caractères de lUS-ASCII sont déjà codés par leur valeur scalaire sur 1 octet, il aurait suffi de coder directement les autres caractères de ce jeu simplement en les préfixant par loctet préfixe 0x21 (chaque fois que la valeur de delta est inférieure à -64 ou supérieure à +63, cest-à-dire quand ils ne peuvent pas être codés sur un seul octet de delta entre 0x50 et 0xCF), sans que cela nentre en collision avec les autres deltas négatifs (Cela aurait même pu être utilisé pour tous les caractères de lISO 8859-1 inférieurs à U+00F0, y compris donc les caractères de contrôle C1).
    • Il aurait même pu être possible de faire que, dans ce cas-, la variable détat ne soit pas synchronisée et conserve sa valeur (afin déviter davoir à coder ensuite sur plus de 2 octets une grande valeur positive de delta, pour revenir au bloc qui contenait le dernier caractère encodé avant ces caractères de lUS-ASCII), comme le fait déjà le codage (sur un seul octet) de lespace U+0020.
    • Ces possibilités de compression supplémentaires nont pas été retenues dans BOCU-1 (alors quelles auraient été utiles pour les écritures asiatiques dans des documents HTML et XML lutilisation mixte des caractères syntaxiques de lUS-ASCII et des caractères asiatiques est fréquente).
Calcul, mappage et ordonnancement des octets de suffixe

Les deltas sont ajustés en valeur absolue en retranchant la valeur absolue minimale de chaque intervalle auxquels ils appartiennent, puis ils sont exprimés dans la base numérique 243 (par divisions euclidiennes successives de la valeur absolue du delta ajusté dans chaque intervalle de codage) afin obtenir une suite de chiffres entre 0 et 242 dans cette base. Le signe est alors rétabli sur ce décalage (par une opération de complément à 243 pour les deltas négatifs), et chaque chiffre de cette base qui est alors mappé sur les 243 valeurs possibles d'octets de suffixe décrits ci-dessus.

L'ordre croissant de mappage des 243 décalages signés calculés suit la progression binaire croissante des 243 valeurs doctets de suffixe utilisés (de 0x01 à 0x06, de 0x10 à 0x19, et de 0x1C à 0x1F et de 0x21 à 0xFF), lesquels sont codés dans lordre du chiffre de poids fort (dans la base 243) vers le chiffre unitaire de poids faible, ce qui assure que la compression finale produira aussi un code ordonné dans lordre binaire.

Utilisation

Il est aussi destiné à être utilisé pour la compression de textes courts (par exemple pour le stockage de champs dans une base de données), pour lesquels il est aussi souhaitable de pouvoir effectuer de la recherche en texte plein. À linverse des codages UTF-8/16/32, il noffre pas une possibilité de resynchronisation depuis une position aléatoire dans un texte. Mais des possibilités limitées de resynchronisation existent dans les textes contenant des phrases et paragraphes (et non des mots isolés), par le fait que les espaces, tabulations et séparateurs de ligne sont laissés inchangés (ces possibilités peuvent ne pas exister dans les textes idéographiques écrits sans espace).

Ce schéma de compression est seulement adapté au stockage ou à la transmission de textes conformes à Unicode ou lISO/CEI 10646, il nest pas conçu pour fonctionner correctement avec les données binaires pour lesquels les formats de compression de fichiers quelconques (comme deflate ou compress utilisés dans MIME, ou les formats darchive zip, gzip, bzip2) sont mieux adaptés. Ces formats de compression peuvent être utilisés en complément pour améliorer encore les textes codés avec BOCU-1.

Son implémentation est très simple à mettre en œuvre et à certifier, contrairement aux algorithmes génériques de compression de données binaires qui nécessitent souvent la gestion dun nombre élevé de variables détat et de tampons de taille souvent variable, ou qui travaille sur des entités aussi petites que le bit: les performances seront donc souvent bien meilleures pour un traitement local au sein dun même processus ou entre processus dun même système hôte, quavec les algorithmes de compression génériques (qui en revanche pourront savérer parfois meilleurs dans le cas de données très volumineuses ou accédées depuis un médium lent ou via un réseau, au prix dune charge processeur bien supérieure).

Problèmes

Propriété intellectuelle : brevet et licences

Ce schéma de codage, qui ne fait pas partie du standard Unicode mais y est mentionné dans une note technique optionnelle, est le seul qui soit restreint dans son utilisation par le fait quil est couvert par un brevet décrivant un algorithme plus général (brevet détenu actuellement par IBM car il a été créé et publié par des personnes qui étaient alors employées par lui).

Cependant IBM a accepté den offrir des licences gratuites (sans paiement de redevance ou royalties) à tous les développeurs qui en feraient la demande en produisant une version pleinement conforme à la documentation fournie par IBM (ce quIBM peut vérifier, mais ce qui en interdit toute modification, amélioration ou adaptation à des algorithmes dérivés, sans obtention dune licence). Le brevet couvre notamment la méthode et les principes de codage utilisés.

BOCU-1 est une version particulière (libérée des contraintes de royalties) de lalgorithme de codage plus général BOCU (qui est, lui, soumis à lobtention dun accord de licence) et qui permet de réserver dautres valeurs doctets invariants ou interdits pour le codage des caractères de lUCS mais nécessaires à dautres fonctions ou données dans certains protocoles (par exemple pour le codage complet de lUCS dans un code barre restreint à 47 valeurs doctets utilisables, ou encore dans le système de noms de domaines DNS restreint à 37 valeurs doctets utilisables).

IBM a mis en œuvre (dans sa bibliothèque ICU, fournie sous la licence libre X modifiée pour ICU et signée par IBM) une variante de cet algorithme plus général BOCU pour la compression des clés de collation générées pour lalgorithme de tri normalisé UCA Unicode, afin de compresser les poids de collation de chaque niveau, en évitant dutiliser certaines valeurs doctets réservés (par exemple loctet nul) ce qui permet de stocker les clés de collation dans des chaînes de caractères C le caractère nul est réservé, et un code est réservé au séparateur de clés de tri multiniveaux.

Compatibilité insuffisante

La variante libre BOCU-1 de lalgorithme BOCU souffre de plusieurs problèmes :

  • Parmi les 243 valeurs doctets utilisées dans des codes variables, figurent 19 codes de contrôles C0 et le caractère de contrôle DEL (U+007F) parfois utilisé comme caractère de bourrage dans certains protocoles. BOCU-1 nest donc pas compatible avec les applications qui dépendent de lISO 646.
  • Les valeurs doctets caractères de contrôle C1 (U+0080 à U+009F) sont utilisés aussi de façon variable et perdent leur fonction de contrôle (il reste possible de les encoder mais sous la forme de deltas mono-octets ou multioctets), mais cest un problème mineur (UTF-8 réencode aussi ces contrôles additionnels sous forme de séquences multi-octets).
  • Les possibilités de synchronisation pour une recherche depuis une position aléatoire sont insuffisantes.
    • Elle ne sépare pas les octets de préfixe ou octets de code unique des octets de suffixes utilisés pour les points de code codés sur plusieurs octets. La lecture ne peut être quunidirectionelle pour les points de code représentés sous forme de séquences multi-octets codés sous forme de deltas.
    • Le codage, même sil est prédictif et ne permet quun seul codage du même texte (contrairement à SCSU diverses stratégies de compression sont possibles), ne produit pas toujours la même séquence doctets pour les mêmes points de code (comme le permet UTF-8) puisque les points de code sont représentés le plus souvent par une différence avec un point de code de référence dépendant du point de code précédent.
    • BOCU-1 ne peut donc pas être utilisé avec les algorithmes de recherche rapide comme lalgorithme de Boyer-Moore qui peut trouver de fausses occurrences positives. Ce codage est donc très mal adapté comme codage en mémoire pour le travail des éditeurs de texte et algorithmes de traitement de chaînes demandant des recherches-substitutions rapides (en revanche il parait idéal si le texte est constitué de petits enregistrements séparés par des sauts de ligne, par exemple dans des tables de données à trier, fichiers journaux, lexiques...
  • Trop peu de valeurs doctets sont réservées pour la synchronisation, qui ne peut avoir lieu que sur les espaces normales (U+0020) et sauts de lignes codés dans lUS-ASCII.

Compression simple mais non optimale

La partition des points de code en grands-sous-ensembles présuppose que les points de code présents dans un texte seront majoritairement dans des blocs de cette taille. Lalgorithme na pas été revu pour prendre en compte les écritures dont les points de code utilisés sont distribuées sur plusieurs blocs distincts.

  • De nouveaux syllabaires (codés dans Unicode et ISO/CEI 10646 dans des blocs plus grands que 128 points de code) ne font pas partie des exceptions retenues à la taille par défaut de bloc de 128 points de code. Il est impossible de modifier cette liste sans rendre limplémentation non conforme (et donc soumise à un accord de licence non libre en vertu du brevet mentionné ci-dessus).
  • Les seuls points de code hors du bloc optimal qui ne conduisent pas à coder de grandes valeurs de delta sur plusieurs octets puis à nouveau un valeur de delta de signe opposé pour revenir dans le bloc de base sont les seuls codes de contrôle C0 et lespace normale (U+0020). Toutes les autres ponctuations, ou même les points de code des diacritiques génériques (qui sont utilisés dans lécriture latine, comme aussi les écritures grecques et cyrilliques), ainsi que les ponctuations générales du bloc latin de base quand elles sont utilisées dans d'autres écritures, nécessitent de grandes valeurs de delta, donc un codage multioctet de ces caractères et du caractère qui le suit: dans ce cas, BOCU-1 sera donc un peu moins efficace en compression que les jeux de caractères 8 bits spécialisés pour certaines langues.
  • Il nest pas possible de définir dautres tailles de blocs optimales pour la détermination du meilleur point de code au centre dun bloc qui sera celui conservé dans la variable détat (La compression SCSU utilise une stratégie plus fine).
  • Il nest pas possible dutiliser plus dune variable détat, chacune portant par exemple sur des blocs distincts mais de plus petite taille (par exemple deux variables contenant un point de code dans des blocs de 64, et un encodage des deltas prenant en compte le bloc le plus proche et la différence de probabilité entre les deltas de signes opposés entre ces deux blocs).
  • Même avec une seule variable détat, lalgorithme nest pas complètement optimal car il ny a pas le même nombre (ni la même fréquence dans les textes) de points de code avant et après le bloc dans lequel la variable détat est positionnée :
    • lorsque la variable détat est à sa valeur initiale (U+0040) ou juste après le codage dun code de contrôle C0 (ou du code spécial reset 0xFF) qui réinitialise cette valeur, aucune valeur de delta négative ne peut être codée sur plusieurs octets : la moitié des possibilités de codage multioctets est inutilisée (on ne trouvera donc jamais aucun des 47 octets de préfixe réservés au codage multi-octets des valeurs de delta négatives inférieures à -64).
    • lalgorithme a omis dégaliser les valeurs possibles de deltas entre les valeurs négatives et positives, alors quil pouvait le faire simplement en traitant lensemble complet des points de code représentables (entre U+0000 et U+10FFFF, dont on peut aussi exclure lintervalle U+D800 à U+DFFF des demi-codets par décalage pour compacifier un peu plus cet espace) comme des positions sur un cercle de périmètre 0x110000 (ou 0x10F800 si lon compacte les demi-codets) qui peut être parcouru dans les deux directions de façon cyclique. Dans des textes usuels, le bloc le plus fréquemment utilisé sera plus près du début de lespace des points de code, et donc les valeurs de delta codées sur plusieurs octets utiliseront très majoritairement des valeurs positives pour sortir de ce bloc, lequel sera immédiatement suivi très majoritairement valeur de delta de signe opposé et codée sur plusieurs octets pour revenir au bloc initial. Comme les deux ensembles ne sont pas de taille égale, lalgorithme peut utiliser parfois plus de séquences codées sur 3 octets que nécessaire, ou 2 octets auraient pu suffire.
  • Lalgorithme ne réordonne pas non plus les blocs de points de code possibles en fonction du bloc actuel, avant de calculer les valeurs de delta selon cet ordre, afin de prendre en compte certains blocs alternatifs nettement plus fréquents que dautres : par exemple le bloc des diacritiques combinants nest pas rapproché du bloc courant quand cest le bloc latin de base ou le bloc grec ou cyrillique de base, et ne rapproche pas non plus le bloc latin contenant les ponctuations générales quand le bloc courant nest pas le bloc latin de base : trop de valeurs de delta codées sur plusieurs octets nécessitent 3 octets au lieu de 2 seulement.
  • Il na pas non plus tenu compte de la distribution des blocs de points de code référencés par les encodages 8 bits qui ont été normalisés depuis longtemps, et qui étaient pourtant de bons indicateurs de la fréquence dusage des blocs alternatifs, et qui restent meilleurs le plus souvent pour le codage dHTML ou XML les excursions du bloc de lécriture courante (pour le texte littéral du document) vers le bloc latin de base (contenant les symboles de ponctuations syntaxiques et les noms de balises et attributs HTML standards) sont très fréquentes. Même UTF-8 savère plus efficace dans ce dernier cas.
  • Lalgorithme nest pas autoadaptatif : dans toute paire de points de code à représenter, le second sera toujours représenté par la même valeur de delta, et donc toujours codé avec le même nombre doctets, quelle que soit sa fréquence dans le texte. Les algorithmes de compression génériques (à base de dictionnaires enregistrant les paires les plus probables selon leur distribution statistique déjà constatée) donnent de bien meilleurs résultats (et peuvent aussi coder ces paires fréquentes en réduisant même le nombre de bits par unité à coder, lesquelles peuvent être même de longueur plus longues, en utilisant des fractions doctets dans le codage final).

Voir aussi

Articles connexes

  • International Components for Unicode (ICU), ensemble de bibliothèques (développées en source ouvert et distribuées librement sous licence X version ICU) pour lintégration en C/C++ ou Java du support des normes Unicode/ISO/IEC 10646 et linternationalistion des logiciels, capables de convertir des textes conformes à Unicode, entre BOCU-1 et divers encodages nationaux ou internationaux (standards ou normalisés).
    Les bibliothèques ICU, très modulaires et réputées (pour leur qualité, leur stabilité, leur conformité stricte aux standards et normes quelles implémentent, ainsi que pour leur performance et la quasi-exhaustivité des fonctionnalités, écritures, langues et jeux de caractères codés quelles supportent) ont également été intégrées partiellement ou totalement à de nombreux autres langages de programmation ou sous-systèmes à laide de modules interfaces spécifiques pour ces langages (PHP, Perl, C#/J#/VB, etc.) ou sous-systèmes et ateliers écrits dans ces langages.

Références externes

Nuvola apps package wordprocessing.png Codés sur 8 bits Autres Articles connexes Codage des caractères, Clavier dordinateur, Police numérique, Glyphe, Portail:Écriture

Wikimedia Foundation. 2010.

Contenu soumis à la licence CC-BY-SA. Source : Article Binary Ordered Compression for Unicode de Wikipédia en français (auteurs)

Игры ⚽ Поможем решить контрольную работу

Regardez d'autres dictionnaires:

  • Binary Ordered Compression For Unicode — Unicode Jeux de caractères UCS (ISO/CEI 10646) ISO 646, ASCII ISO 8859 1 WGL4 UniHan Équivalences normalisées NFC (précomposée) NFD (décomposée) NFKC (compatibilité) NFKD (compatibilité) Propriétés et algorithmes …   Wikipédia en Français

  • Binary ordered compression for unicode — Unicode Jeux de caractères UCS (ISO/CEI 10646) ISO 646, ASCII ISO 8859 1 WGL4 UniHan Équivalences normalisées NFC (précomposée) NFD (décomposée) NFKC (compatibilité) NFKD (compatibilité) Propriétés et algorithmes …   Wikipédia en Français

  • Binary Ordered Compression for Unicode — BOCU 1 is a MIME compatible Unicode compression scheme. BOCU stands for Binary Ordered Compression for Unicode. BOCU 1 combines the wide applicability of UTF 8 with the compactness of SCSU. This Unicode encoding is designed to be useful for… …   Wikipedia

  • Standard Compression Scheme for Unicode — The Standard Compression Scheme for Unicode (SCSU) [cite web |url=http://www.unicode.org/reports/tr6/ |title=UTS #6: Compression Scheme for Unicode |date=2005 05 06 |accessdate=2008 06 13 ] is a Unicode Technical Standard for reducing the number… …   Wikipedia

  • Comparison of Unicode encodings — This article compares Unicode encodings. Two situations are considered: 8 bit clean environments and environments that forbid use of byte values that have the high bit set. Originally such prohibitions were to allow for links that used only seven …   Wikipedia

  • BOCU-1 — Binary Ordered Compression for Unicode Unicode Jeux de caractères UCS (ISO/CEI 10646) ISO 646, ASCII ISO 8859 1 WGL4 UniHan Équivalences normalisées NFC (précomposée) NFD (décomposée) NFKC (compatibilité) NFKD (compatibilité) Propriétés et… …   Wikipédia en Français

  • Trie — A trie for keys A , to , tea , ted , ten , i , in , and inn . In computer science, a trie, or prefix tree, is an ordered tree data structure that is used to store an associative array where the keys are usually strings. Unlike a binary search… …   Wikipedia

  • Windows Registry — The Windows Registry is a hierarchical database that stores configuration settings and options on Microsoft Windows operating systems. It contains settings for low level operating system components as well as the applications running on the… …   Wikipedia

  • Index (search engine) — Search engine indexing collects, parses, and stores data to facilitate fast and accurate information retrieval. Index design incorporates interdisciplinary concepts from linguistics, cognitive psychology, mathematics, informatics, physics, and… …   Wikipedia

  • Portable Document Format — PDF redirects here. For other uses, see PDF (disambiguation). Portable Document Format Adobe Reader icon Filename extension .pdf Internet media type application/pdf application/x pdf application/x bzpdf application/x gzpdf …   Wikipedia

Share the article and excerpts

Direct link
https://fr-academic.com/dic.nsf/frwiki/215625 Do a right-click on the link above
and select “Copy Link”