D o m i n i q u e   G u e b e y     J u n g l e      Tout sur XHTML

Le codage des caractères

Sommaire :

Préambule

Les documents Web et beaucoup d’échanges, protocoles et services associés sont fondés sur une structure et des données TEXTE, c’est à dire composés de suites de caractères identifiables (chiffres et lettres, signes de poncturation, espaces...). Sur l’opposition texte/binaire voir plus bas. Le texte a l’avantage d’être facilement convertible et portable entre différents types d’ordinateurs, systèmes ou appareils de transmission. Mais cette universalité ne saurait être sans l’adoption de conventions et de normes. Dès lors, une initiation à l’encodage est un passage obligé si on veut répondre aux exigences minimales de qualité et ne pas se trouver dépourvu dans des cas comparables à ce qui suit.

Le texte attendu [1]  :

Ich bin der Geist, der stets verneint !
Und das mit Recht ; denn alles, was entsteht,
Ist wert, dass es zugrunde geht ;
Drum besser wär's, dass nichts entstünde.

Le texte obtenu :

Ich bin der Geist, der stets verneint !
Und das mit Recht ; denn alles, was entsteht,
Ist wert, dass es zugrunde geht ;
Drum besser wär?s, dass nichts entstünde.

L’apostrophe du dernier vers pose problème. Explication plausible : le directeur de publication s’est laissé convaincre par son neveu qu’il lui fallait un site internet. Bombardé webmestre, ledit neveu n’a eu de cesse que de coller dans des pages dûment étiquetées au format standard iso-8859-1 des textes copiés tout droit de son traitement de texte Microsoft codant en cp-1252. L’anomalie sur le caractère apostrophe est un signe très sûr de cette aberration.

Il y a encore plus spectaculaire. Le texte atttendu :

So ist denn alles, was ihr Sünde,
Zerstörung, kurz das Böse nennt,
Mein eigentliches Element.

Le texte obtenu :

So ist denn alles, was ihr Sünde,
Zerstörung, kurz das Böse nennt,
Mein eigentliches Element.

Explication : on a lu en iso-8859-1 un texte encodé en fait en UTF-8. Cette dernière norme permet de représenter un très grand nombre de caractères, mais pour beaucoup d’entre eux, comme les voyelles latines accentuées, l’encodage prend deux fois plus de place, d’où l’apparition des deux caractères bizarres à la place d’un seul.

Reprenons donc les choses par le début.


Du BIT à l’OCTET

Une mémoire d’ordinateur réside :

  1. soit dans une mémoire vive (circuit miniaturisé qui doit être sous tension, et s’efface dès que le courant est coupé).
  2. soit sur un support de stockage permanent. Ce dernier est souvent un disque magnétique recouvert d’oxyde de fer (suivant la même technique que les classiques bandes magnétiques) ; ce peut être aussi un système optique (comme les CD-Rom).

L’information stockée sous forme d’unités élémentaires électriques ne peut prendre que 2 valeurs (0 ou 1), selon que l’emplacement est chargé positivement ou négativement. Cette unité d’information fondamentale est un « bit ». On conviendra que 2 valeurs est très limitatif, à côté par exemple des 26 lettres de l’alphabet latin.

En informatique, l’unité usuelle n’est pas le bit mais plutôt le groupe de 8 bits qu’on nomme octet, ou byte. On peut aussi simplement l’appeler "caractère" dans les cas d’encodage simple comme ASCII.

Un octet peut prendre 256 valeurs différentes (2x2x2x2x2x2x2x2 ou " 2 puissance 8 ") allant de 0 à 255. Exemples avec l’équivalent en notation décimale habituelle :


Notation hexadécimale

Une notation commode est l’hexadécimale. Au lieu d’utiliser seulement la base dix avec les chiffres de 0 à 9, on utilise une base 16 ("2 puissance 4") en ajoutant les 6 lettres de A à F. Un octet se notera ainsi avec seulement 2 caractères :

Pour signaler l’utilisation de l’hexadécimal, une habitude ancienne est d’ajouter "x" avant ou après. Exemple : 42 (décimal) = 0x2a (hexadécimal) ou encore '2a'x. La même notation peut se trouver dans des entités en X/HTML : ֣ affiche la même chose que ֣ (sur la notion d’entité, voir plus loin [http://www.dg77.net/tekno/xhtml/specarac.htm#ent])

Voici une table de conversion. Les lignes correspondent au premier caractère, les colonnes au second. Exemple : x41=(4x16)+1=65 (1=2ème colonne, ne pas oublier qu’il s’agit non pas de nombres mais de numérotage qui commence par zéro).

    0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
0  000 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015
1  016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031
2  032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047
3  048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063
4  064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079
5  080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095
6  096 097 098 099 100 101 102 103 104 105 106 107 108 109 110 111
7  112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
8  128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
9  144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
A  160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
B  176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
C  192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
D  208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
E  224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
F  240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255

Il est utile de disposer d’un éditeur hexadécimal, par exemple XVI32 (sous MS Windows), Shed, Khex, Ghex (UNIX/Linux), Hexedit (MacOs). Cet outil très simple permet d’inspecter et éventuellement modifier n’importe quelle donnée grâce à l’affichage exact du code interne des octets.


Binaire contre Texte, et autopsie de fichiers

L’objet couramment manipulé dans les ordinateurs est le fichier (en anglais file), bloc d’informations plus ou moins structurées. Un fichier peut contenir différents types d’informations, en fonction de son utilisation. Celà va de la table contenant un fichier client, avec ses colonnes bien définies (nom, adresse, références bancaires, etc...) jusqu’aux suites cabalistiques d’instructions et d’adresses machine des programmes compilés ; sans parler des fichiers d’images, sons et autres envahissants objets multimédia.

Il n’existe pas de définition formelle de ce qu’est un fichier binaire, et guère mieux pour le texte. En pratique, le contenu texte sera lisible par l’être humain, et le binaire ne le sera pas. En général, on remarquera qu’un fichier binaire n’est pas divisé en enregistrements ou lignes séparées par un caractère de saut ou fin-de-ligne, mais ceci n’est pas vraiment significatif. Des fichiers textes peuvent se retrouver sous forme binaire s’ils sont compressés [2] ou cryptés.

Un intérêt des fichiers binaires est d’être plus compacts et plus rapides d’utilisation par les programmes que les fichiers textes. Ceci est dû au fait qu’ils sont normalement plus proches du fonctionnement intime (au niveau matériel) de la machine, alors qu’un fichier texte doit d’abord être interprêté par elle. Mais il y a des contreparties à cette puissance des données binaires, en dehors du fait qu’elles sont proprement incompréhensibles. Elles doivent être lues et manipulées par un programme ad-hoc, et suivre les particularités de la plate-forme informatique utilisée [3]. A l’inverse, les fichiers textes ne souffrent pas de cette dépendance au système.

Un fichier peut contenir en même temps du texte et du binaire. L’illustration (fig. 2) donne un exemple avec une image JPEG, d’un artiste aux mérites probablement méconnus. Le format JPEG (qui est d’ailleurs une méthode de compression particulière) peut embarquer des indications textuelles sur le sujet. L’image suivante (fig. 3) montre le même fichier visionné dans l’éditeur hexadécimal XVI32 [http://www.chmaas.handshake.de/] . Le panneau de gauche donne les codes hexadécimaux. Dans celui de droite, on distingue au début l’indication "Photoshop 3.0" significative, puis les mentions IPTC renseignées (grâce à XnView [http://www.xnview.com] ) pour les besoins de la démonstration (copyright, instructions spéciales, légende, source, auteur...). La suite contient les données binaires non représentables (en principe 24 bits pour chaque pixel) qui permettront à un programme adapté de faire apparaître l’image à l’écran ou en impression.


ASCII

ASCII (i.e. American Standard Code for Information Interchange), est un encodage en mode caractère basé sur l’alphabet anglais, dépourvu d’accents. Les codes ASCII représentent du texte dans les ordinateurs et tout appareil utilisant des informations en mode texte. Beaucoup d’encodages subséquents sont historiquement dérivés d’ASCII, standard publié en 1967 et dont la dernière version est de 1986. ASCII définit les codes pour 95 caractères ASCII "imprimables", numérotés de 32 à 126 ; et 33 caractères dits non imprimables, la plupart obsolètes.

Type Binaire Déc. Hex. Caractères
Caractères "non imprimables" 00000000 à 00011111 0 à 31 00 à 1F ex: touches Entrée, tabulation, fin de ligne, retour chariot, verrouillage/déverrouillage clavier...
01111111 127 7F Touche de suppression [DEL]
Espace 00100000 32 20
Caractères de ponctuation et signes divers 00100001 à 00101111 33 à 47 21 à 2F ! " # $ % & ' ( ) * + , - . /
Chiffres 00110000 à 00111001 48 à 57 30 à 39 0 1 2 3 4 5 6 7 8 9
Divers autres signes 00111010 à 01000000 58 à 64 3A à 40 : ; < = > ? @
Lettres en majuscules 01000001 à 01011010 65 à 90 41 à 5A A B C D ... X Y Z
Divers autres signes 01011011 à 01100000 91 à 96 5B à 60 [ \ ] ^ _ `
Lettres en minuscules 01100001 à 01111010 97 à 122 60 à 7A a b c d ... x y z
Divers autres signes 01111011 à 01111110 123 à 126 7B à 7E { | } ~

Noter que pour passer de majuscules en minuscules, il suffit d’ajouter 32 (soit 1 au 3ème bit, ou +10000).

Voir la TABLE COMPLETE en annexe.

Le code ASCII utilise 7 bits soit 128 possibilités, le 8ème bit étant destiné au contrôle de parité [4], ou à gérer les interruptions. Ceci était bien conforme aux machines anciennes fonctionnant sur 8 bits. Aujourd’hui seulement 128 codes d’interruption ferait pleurer tout ingénieur-système. Par ailleurs, en ASCII les caractères accentués manquent, ce qui indiffère les anglophones mais pêche pour beaucoup d’autres utilisateurs de l’alphabet latin.

Il s’est trouvé que l’informatique a fleuri dans la langue de Shakespeare, langue dont l’écriture latine est restée plus près de ses origines que d’autres, ignorant les caractères accentués. John Donne s’affichai dès l’origine sans difficulté [5] :

O my America ! my new-found-land,
My kingdome, safeliest when with one man man’d
My Myne of precious stones, My Emperie,
How blest am I in this discovering thee !

Mais il y avait problème pour un Luis de Góngora, avec ses ó, ¿, é, á, í et autres ñ [6] :

Si Amor entre las plumas de su nido
prendió mi libertad, ¿ qué hará ahora,
que en tus ojos, dulcísima señora,
armado vuela, ya que no vestido ?

On s’est donc ingénié à concevoir des tables de codages qui prévoient le maximum de caractères accentués ou spéciaux.


CP850 et quelques autres pages de codes

Origines

Ce sont les pages de code IBM PC, descendantes d’ASCII, mais codées sur 8 bits au lieu de 7, ce qui double les possibilités.

Quelques CP
CP437

CP437 est presque aussi ancien qu’ASCII et n’est cité ici que pour son rôle historique. Son affichage dans un éditeur graphique peut produire des effets curieux. CP437 ne permet pas une internationalisation satisfaisante.

CP850

CP850 est toujours susceptible d’être renconté chez nous. C’est l’encodage type de DOS « Latin-1 » d’Europe occidentale, encore utilisé dans les terminaux ("invite de commande", "shell"...) sur les machines tournant sous MS-Windows en CP1252. Cette table a une partie commune avec CP437. Elle contient aussi les mêmes caractères (quoique à des positions différentes) qu’ISO-8859-1. Voir la table complête


ISO 8859

La norme ISO/CEI 8859-1, souvent appelée Latin-1, forme la première partie de la norme internationale ISO/CEI 8859, norme de l’ISO, Organisation internationale de normalisation, pour le codage des caractères en informatique. Elle définit "l’alphabet latin numéro 1", composé de 191 caractères, chacun d’entre eux étant codé par un octet.

Voir en annexe l’exemple de TABLE COMPLETE pour ISO-8859-1.

ISO 8859 est une solution qui a été trouvée pour pallier à l’insuffisance de la table ANSI, qui ne permet pas de représenter tous les caractères accentués des différents alphabets occidentaux. Plus de 10 tables différentes ont été ainsi définies.


Windows-1252 / CP-1252

Windows-1252 est un encodage similaire à ISO-8859-1, à la différence près que cette table comporte des caractères imprimables à la place de caractères de contrôle (0x80 à 0x9F) interdits en HTML. Cette page de code a d’ailleurs varié dans le temps tout en conservant la même référence... Voir la TABLE en annexe.

Comme il s’agit de l’encodage par défaut du très répandu système d’exploitation Microsoft Windows, il ne faut pas s’étonner de voir nombre de navigateurs Web ne pas faire de distinction. Quand se présente un code interdit dans une page censée être ISO-8859-1, ils le traîtent automatiquement sous la forme prévue par Microsoft.

Ce n’est pas une raison pour tomber soi-même dans ce coupable laxisme quand on crée des documents. Il faut garder en vue que le XHTML n’est pas simplement fait pour être affiché. Ces documents doivent pouvoir être traîtées par des programmes (robots, moteurs de recherche, parsers...) ; sinon c’en est fait de l’interopérabilité.

En conséquence, la moindre des choses est que la saisie se fasse par l’intermédiaire d’un éditeur potable et convenablement configuré.


Entrée des codes au clavier

Avec un éditeur ou un traîtement de textes, il est généralement possible d’utiliser le code interne à la place de la touche prévue sur le clavier. Par exemple dans Open-Office, [http://www.openoffice.org] pour le O majuscule défini par la valeur 79 (x4F) dans la table ASCII, on peut utiliser la séquence : [Alt]+79.

Ceci est évidemment utile pour des caractères qui ne sont pas sur le clavier. Ainsi le code 223 (xDF) permet d’avoir le "s gothique" (ß) cher aux germanophones. Mais ça l’est aussi pour des codes de l’ASCII de base : un traîtement de texte transforme souvent certains caractères sans demander l’avis de celui qui frappe la page. Ainsi, un double quote (") deviendra automatiquement un guillemet (« ou »). Or, on peut ne pas souhaiter ce qui se justifie par ailleurs pour des raisons d’esthétique et de qualité typographique. Si on veut réellement indiquer un double-quote, par exemple parce qu’on reproduit une instruction informatique ou le contenu d’un fichier XML, il est utile de connaître le procédé (en l’occurence, entrer [Alt] + 34).


Quoted printable

Quoted printable est une technique destinée à contourner les limites du protocole d’envoi des courriers électroniques SMTP, qui ne connaît que l’ASCII. On peut avoir à s’en préoccuper pour la raison suivante : dans une page Web, la méthode du formulaire permet à un tiers d’entrer des textes et données. Il existe ensuite différentes modalités pour exploiter ces informations. L’une d’entre elles consiste à transférer le résultat saisi dans un e-Mail. C’est pratique pour des sites internet hébergés par un fournisseur externe et dont l’accès est limité à quelques fonctions de base. Supposons qu’un correspondant nous confie ce qui suit :

Coordonnées expéditeur Sender
Nom-Name:
eMail:

Texte:

Le texte transmis par le courrier électronique sera un peu différent.

L=E0, j'ai eu =E0 r=E9veiller un monde qui n'=E9tait connu que de moi, =
je n'ai rencontr=E9, en errant dans cette soci=E9t=E9 =E9vanouie, que =
des souvenirs et le silence ; de toutes les personnes que j'ai connues, =
combien en existe-t-il aujourd'hui ? Les habitants de Saint-Malo =
s'adress=E8rent =E0 moi le 25 ao=FBt 1828, par l'entremise de leur =
maire, au sujet d'un bassin =E0 flot qu'ils d=E9siraient =E9tablir. Je =
m'empressai de r=E9pondre, sollicitant en =E9change de bienveillance, =
une concession de quelques pieds de terre, pour mon tombeau, sur le =
Grand-B=E9.

Le principe est simple : pour chaque caractère qui n’entre pas dans la liste des codes ASCII, on positionne un "=" suivi par la valeur hexadécimale iso-8859-1 du caractère à représenter. Le "=" doit lui aussi être remplacé par "=61" bien qu’il entre dans la gamme ASCII. Il y a quelques autres règles, parmi lesquelles la limitation à 76 caractères de chaque ligne, qui doit se terminer par un "=" isolé (non traduit au décodage).

Si on veut gérer son propre système de réception et traîtement des informations, automatiser le décodage (comme l’encodage) quoted-printable n’est pas un problème : cela fait belle lurette que les programmeurs fous de tous les horizons ont rivalisé dans tous les langages pour fournir leurs "scripts" (voir sur Internet).

Quoted-printable fait partie des encodages MIME. Les types MIME font l’objet d’une section ultérieure.


EBCDIC, CCSID et DBCS

carte perforee IBM
Extended Binary Coded Decimal Interchange Code

Qui dit EBCDIC dit IBM. Comme les machines de Big Blue sont assez répandues, il n’est pas rare, en entreprise, de devoir aller piocher dans la base de données d’un de ces engins. Par conséquent, on se doit de connaître quelques termes et concepts de base, ne serait-ce que pour ne pas subir un trop vif choc culturel le jour où on rencontre l’équipe qui s’occupe de tout ça.

EBCDIC est un codage sur 8 bits, création d’IBM, utilisé depuis le S/360 sorti le 7 avril 1964. Sa conception d’origine est reliée aux cartes perforées utilisées à l’époque pour entrer les données dans les ordinateurs. EBCDIC a été maintenu depuis, et il est toujours mis en oeuvre sur les mainframes (aujourd’hui zSeries sous z/OS) et "mini" (AS/400, alias iSeries, alias System i5...). En revanche, les PC IBM n’utilisent pas EBCDIC mais les mêmes encodages issus d’ASCII que leurs concurrents. EBCDIC est ou était reconnu par d’autres machines, comme les Fujitsu-Siemens et certains Unisys.

En EBCDIC, un byte est divisé en deux parties (« nibbles »). La première est la zone et indique la catégorie du caractère, la seconde est nommé digit et identifie le caractère lui-même. Dans l’exemple de table donnée en annexe, « & » porte le code 0x50 (hexadécimal) ou 80 (décimal) au lieu de 0x26/38 pour l’ASCII. La lettre L sera représentée par 0xD3...

Entre autres caractéristiques : la suite des caractères alphabétiques n’est pas continue, et certains caractères ASCII ne sont pas prévus.

SBCS et DBCS

DBCS Double Byte Character Set : par opposition au SBCS (Simple...) ce codage sur deux octets connaît plusieurs variantes destinées à couvrir les besoins des écritures japonaises, coréennes et chinoises.

CCSID

IBM a prévu quelques dizaines de pages de code, chacune portant un numéro appelé le CCSID (Coded Character Set IDentifier). Voir en annexe les listes détaillées.

Quelques valeurs remarquables :

Un peu de pratique

WDSC - Websphere Developpment Studio Client permet de saisir une ligne de programme source en Hexadécimal, avec le choix simultané de plusieurs encodages. Pour celà : Clic droit sur la vue > Source > Edition hexa. ligne. Sur l’illustration, on voit que R se code 0x0052 en Unicode, 0x52 en CP1252 et 0xD9 en EBCDIC.

Pour ceux qui ont à mettre les mains dans le cambouis, spécialement sur iSeries (ex AS/400), voir la page dédiée à l’art du CCSID sur iSeries.


ISO 10646 et UNICODE

Cadre général

Face aux limites du codage sur 8 bits, des encodages sur plus d’un octet ont été proposés. D’où ISO/IEC 10646 Universal Multiple-Octet Coded Character Set (Jeu de caractères multi-octets universel), abrégé en UCS. Le but est d’encoder tous les caractères de tous les langages du monde, plus les symboles, mathématiques et autres. Deux modes ont été défini : UCS-2 (sur 16 bits) et UCS-4 (sur 31 bits).

A côté d’ISO/IEC existe le consortium UNICODE issu de l’association de constructeurs d’ordinateurs, dont la visée première était de lutter contre le chaos des jeux de caractères et de favoriser l’internationalisation des systèmes. Unicode collabore depuis longtemps étroitement avec ISO/IEC et ses normes sont strictement compatibles avec les définitions d’ISO/IEC 10646.

Présentation

De même que la notation hexadécimale se signale par un "x", un caractère Unicode se décrit avec "U+" suivi de la valeur hexadécimale correspondant au point de code (code point) défini par Unicode. Cette valeur comporte 4 octets entre U+0000 et U+FFFF, plage qu’on appelle le plan de base multilingue ou BMP. La suite a 5 chiffres pour les 15 plans suivants (entre U+10000 et U+FFFFF), ou 6 chiffres pour le dernier plan (entre U+100000 et U+10FFFF).

UCS-2

Dans la formule UCS à deux octets, on définit 256 rangées comprenant chacune 256 cellules. Soit 65.536 positions. La première rangée, ou rangée 0, contient tout simplement le jeu ISO/IEC-8859-1. Voici un aperçu de l’ensemble :

UCS-4

La formule UCS à 4 octets utilise 31 octets seulement, le premier étant obligatoirement 0. Cet espace de codage de 2.147.483.648 positions, comporte 128 groupes de 256 plans. Le premier octet définit le groupe, le second indique le plan. Les troisièmes et quatrièmes donnent les rangées et numéro de cellule de chaque caractère. Le plan 0 du groupe 0 correspond à UCS-2 et prend le nom de Basic Multilingual Plane ou BMP.

Niveaux d’implémentation

Un système peut ne pas supporter toute l’étendue d’UCS. Trois niveaux ont été définis


UTF-8

UTF-8 (UCS transformation format) 8 bits est un format défini pour les caractères Unicode (UCS). Chaque caractère est codé sur une suite de un à quatre octets. UTF-8 a été conçu pour assurer une bonne compatibilité avec les logiciels prévus pour traiter des caractères d’un seul octet. Les protocoles de communication d’Internet échangeant du texte doivent supporter UTF-8.

Description

Unicode attribue un numéro à chaque caractère. Les caractères de numéro 0 à 127 sont codés sur un octet dont le bit de poids fort est toujours nul. Les caractères de numéro supérieur à 127 sont codés sur plusieurs octets. Dans ce cas, les bits de poids fort du premier octet forment une suite de 1 de longueur égale au nombre d’octets utilisés pour coder le caractère, les octets suivants ayant 10 comme bits de poids fort.

Définition du nombre d’octet utilisé
Représentation binaire Signification
0xxxxxxx 1 octet codant 1 à 7 bits
110xxxxx 10xxxxxx 2 octets codant 8 à 11 bits
1110xxxx 10xxxxxx 10xxxxxx 3 octets codant 12 à 16 bits
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 4 octets codant 17 à 21 bits

Ce principe pourrait être étendu jusqu’à six octets pour un caractère, mais UTF-8 pose la limite à quatre. Ce principe permet également d’utiliser plus d’octets que nécessaire pour coder un caractère, mais UTF-8 l’interdit.

Exemples de codage UTF-8
Caractère Commentaire Code numérique Représentation binaire
A 65 01000001
é 233 11000011 10101001
(Monnaie) signe Euro 8364 11100010 10000010 10101100
𝄞 (Musique) Clé de sol 119070 11110000 10011101 10000100 10011110

Dans toute chaîne de caractères UTF-8, on remarque que :

Avantages
Inconvénients

UTF-16

UTF-16 (UCS-2 transformation format). UTF-16 est un format variable qui permet de représenter avec un mot de 2 octets tout le BMP, et les autres plans Unicode avec 2 mots. UCS-2 est le format ISO correspondant mais fixé à 2 bytes et donc limité aux possibilités du seul BMP. Sur le BMP, voir UCS-4 ci-dessus. En pratique, seul UTF-16 est utilisé.

L’UTF-16 est une solution très satisfaisante si la place mémoire n’est pas un problème primordial. En effet, la grande majorité des caractères Unicode assignés aux langues modernes (donc les caractères les plus fréquemment utilisés) le sont dans le plan multilingue de base et peuvent donc être représentés sur 16 bits

UTF-16 en BE (big endian)
Bits 00000000 000uuuuu xxxxxxyy yyyyyyyy
UTF-16 BE (2 octets) si uuuuu = 00000 xxxxxxyy yyyyyyyy
UTF-16 BE (4 octets) 110110ww wwxxxxxx 110111yy yyyyyyyy
avec wwww = uuuuu - 1 si uuuuu > 00000
UTF-16 en LE (little endian)
Bits 00000000 000uuuuu xxxxxxyy yyyyyyyy
UTF-16 LE (2 octets) si uuuuu = 00000 yyyyyyyy xxxxxxyy
UTF-16 LE (4 octets) wwxxxxxx 110110ww yyyyyyyy 110111yy
avec wwww = uuuuu - 1 si uuuuu > 00000

UTF-32

UTF-32 (UCS-4 transformation format). Encodage sytématiques sur 4 octets. Cette formule fixe offre l’avantage de la simplicité mais constitue dans la plupart des cas un considérable gâchi de mémoire. UTF-32 est rarement utilisé.


BOM et phénomènes étranges

BOM - Byte Order Mark, "marque du sens des octets". C’est une suite de caractères utilisée en tout début de fichier ou flot de données pour marquer l’endianness d’une chaîne de caractères Unicode encodée en UTF-16 ou UTF-32 et/ou comme marqueur pour indiquer que le texte est encodé en UTF-8, UTF-16 ou UTF-32.

En UTF-16, le BOM est une séquence de deux octets FE FF au début de la chaîne encodée, indiquant que les caractères encodés suivant utilisent l’ordre big-endian ; avec FF FE, ce sera little-endian. La valeur U+FFFE n’est PAS un caractère Unicode, et peut-être utilisée pour detecter l’ordre des octets, à l’inverse de U+FEFF qui est un caractère connu.

Encodage Séquence BOM
UTF-8EF BB BF
UTF-32, big-endian00 00 FE FF
UTF-32, little-endianFF FE 00 00
UTF-16, big-endianFE FF
UTF-16, little-endianFF FE
UTF-72B 2F 76 [ 38 | 39 | 2B | 2F | 38 2D ]
UTF-EBCDICDD 73 66 73
SCSU (*)0E FE FF
BOCU-1 (**)FB EE 28
(*) Standard Compression Scheme for Unicode
(**) Binary Ordered Compression for Unicode

Correctement interprété, le BOM reste invisible de l’utilisateur final. Sinon, en tête de fichier on voit quelques signes étranges, comme  pour de l’UTF-8 ou þÿ pour l’UTF-16 "big-endian". C’est ce qui peut arriver si dans un éditeur de texte, paramétré par exemple pour iso-8859-1, on ouvre un fichier précédememnt sorti en UTF-8.

Beaucoup de logiciels Windows ajoutent la séquence aux fichiers UTF-8. Cependant, sur des systèmes Unix-like (dont Linux), qui utilisent beaucoup les fichiers textes pour la configuration, cette technique est dangereuse, car cela peut nuire au traîtement correct de codes importants tels que le hash-bang au début d’un script interprété. Il peut également interférer avec le source pour les langages de programmation qui ne le reconnaissent pas.

Le BOM explique dès lors certains problèmes : ne vous étonnez pas que votre script bash refuse de démarrer alors qu’il commence par un  #!/bin/bash  réglementaire (et que bash se trouve vraiment dans /bin !) : demandez vous si, à un moment quelconque, au moins la première ligne n’a pas été entrée sous Windows (avec par exemple Notepad...).


Notes

Cre : 25 aou 2006 - Maj : 16 dec 2008

A propos de ces pages / about these pages : http://www.dg77.net/about.htm
Gen : 2014-05-12-10:19:36,34