Codage binaire du texte
Nous l'avons vu ensemble: in petto, votre ordinateur ne cause que le binaire, "langage" pour le moins basique et rébarbatif qui permet néanmoins de coder n'importe quel nombre imaginable de manière plus ou moins intuitive et plus ou moins exacte.
Plus ou moins...
Oui mais voilà: les nombres, c'est très bien pour les mathématiciens, statisticiens, comptables et autres blouses blanches à gros cursus... mais nous, humains normalement constitués, préférons quand même communiquer avec des mots.
Nouveau défi de taille, donc, pour le processeur de votre machine: se comporter en créature un tant soit peu évoluée et coder des lettres uniquement à l'aide de ses tout petits bits.
Au programme d'Arcana, donc, aujourd'hui: "Deux chiffres et des lettres".
Principes généraux de codage
... .- -- ..- . .-.. -- --- .-. ... .
Emile Baudot, l'homme qui a quasiment donné son nom à l'unité de débit des transmissions informatiques: le baud...Il y a près de deux siècles, Samuel Morse [1791-1872] nous montrait, avec un certain succès, la manière de coder tout un alphabet uniquement à l'aide de deux symboles: un point et un trait.
Logiquement, la chose ne devrait pas présenter trop de problème avec des "1" et des "0", ce que démontra d'ailleurs l'ingénieur français Emile Baudot [1845-1903] dès 1870 avec brioCasimir Brio, son fidèle assistant....
De fait, le principe général du codage binaire du texte est désarmant d'évidence: à chaque caractère que l'on veut coder, on associe un nombre donné, toujours identique.
Pour mener à bien cette numérisation, trois éléments s'avèrent nécessaires:
- Un jeu de caractères, ou répertoire, décrivant tous les caractères que l'on désire pouvoir utiliser,
- Une table de référence, attribuant à chaque caractère du répertoire un code numérique unique,
- Une technique d'encodage, permettant de transformer le code numérique de chaque caractère sous forme binaire, c'est-à-dire d'octet(s).
A noter qu'il est assez fréquent de trouver le terme anglais un peu vague de charset pour désigner, selon le contexte, un jeu de caractères et/ou l'encodage qui lui est attaché.
| Caractère | Code numérique | Code binaire |
| A | 1 | 00000001 |
| B | 2 | 00000010 |
| C | 3 | 00000011 |
| D | 4 | 00000100 |
Extrait de table de référence secrète prise sur un espion monégasque en mission à Menton...
Ainsi, dès lors que vous saisissez du texte avec un ordinateur, ce texte est numérisé par la machine à l'aide d'une table de référence, dont vous ne savez généralement rienOui, il y a des choses qu'il vaut mieux ne pas savoir.... Cette phase d'encodage donne naissance à une séquence binaire plus ou moins longue appelée, éventuellement, à être stockée à des fins de sauvegarde ou de télétransmission.
Avant toute réutilisation de cette séquence, une phase de décodage intervient alors, dans le but de retransformer le code binaire en texte compréhensible. Compréhensible... du moins tant que cette phase de décodage s'appuie sur la même table de référence que celle qui a servi à l'encodage !
Entendons nous bien: une table de référence ne code que des caractères "bruts", sans aucune information quant à leur taille, leur couleur ou leurs fioritures. En d'autres termes, une table de référence décrit des caractères abstraits...quasi platoniciens. et ne précise absolument pas comment ces caractères devront être affichés à l'écran ou après impression.
A rimbaldiens, appréhendés par différentes polices de caractères...C'est la tâche du logiciel qui exploite ces codes...et du système d'exploitation sur lequel s'appuie ce logiciel. de traduire ceux-ci en symboles visuels (ou glyphes) par le recours conjoint à des données de formatage et à une police de caractères.
Citons, pour être complet, que plusieurs tables de référence gravitant dans l'univers nébuleux de l'informatique, il est parfois nécessaire de passer d'une table de référence à une autre; une phase de transcodage s'avère alors nécessaire.
Da ASCII codes
ASCII: la table de l'aloi
Très longtemps, la table de référence la plus utilisée en informatique fut la table ASCIIPrononcer "aski", à la française, ou bien alors "éski", à la branchouille. (American Standard Code for Information Interchange), table compilant un jeu de 128 caractères ci-dessous décrits.
Cette relative petitesse de la table ASCII avait néanmoins l'avantage de rendre aisé l'encodage de ses caractères, chacun pouvant être transcrit sous la forme d'un unique octetMais si c'est très aisé, vous allez voir... sans instruction particulière.
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D | 0E | 0F | |
| 0 | NUL(Null) | SOH(Start Of Heading) | STX(Start of TeXt) | ETX(End of TeXt) | EOT(End Of Transmission) | ENQ(ENQuire) | ACK(ACKnowledge) | BEL(BELl). Ça alors ! Un caractère sonore ! | BS(Backspace) | TAB(Tabulation) | LF(Line Feed) | VT(Vertical Tabulation) | FF(Form Feed) | CR(Carriage Return) | SO(Shift Out) | SI(Shift In) |
| 1 | DLE(Data Link Escape) | DC1(Device Control 1) | DC2(Device Control 2) | DC3(Device Control 3) | DC4(Device Control 4) | NAK(Negative AcKnowledge) | SYN(SYNchronous idle) | ETB(End of Transmission Block) | CAN(CANcel) | EM(End of Medium) | SUB(SUBstitute) | ESC(ESCape) | FS(File Separator) | GS(Group Separator) | RS(Record Separator) | US(Unit Separator) |
| 2 | espace | ! | " | # | $ | % | & | ' | ( | ) | * | + | , | - | . | / | 3 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
| 4 | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
| 5 | P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ^ | _ |
| 6 | ` | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
| 7 | p | q | r | s | t | u | v | w | x | y | z | { | | | } | ~ | DEL(DELete) |
Attention ! Les codes des différents caractères sont ici exprimés en hexadécimal...une manière plus conviviale de parler en binaire., et s'étendent donc de #00 (0) à #7F (127).
Cette table, véritable légende de l'informatique médiévale...c'est-à-dire, grosso modo, les années cinquante., appelle illico quelques commentaires bien sentis:
- Certains caractères de cette table - marqués d'un fond jaune - s'avèrent un peu particuliers puisqu'ils ne correspondent pas à des caractères graphiques; ce sont des caractères de contrôle. Leur raison d'être tient à l'histoire de la table ASCII qui servait jadis de table de référence, certes, mais également de standard de communication entre terminaux informatiques qui pouvaient ainsi, grâce aux mêmes codes ASCII, s'échanger non seulement des informations textuelles (les caractères proprement dits) mais également des signaux de commandes
- Les chiffres disposent de leurs propres codes ASCII, entre #30 (48) et #39 (57).
Vous noterez en passant qu'un ordinateur code très différemment un chiffre selon qu'il s'agit de sa valeur numérique ou de son caractère graphiqueAinsi, par exemple, 32 sera codé par l'octet 00100000 lorsqu'il s'agira du nombre entier 32, mais par le couple d'octets 00110011-00110010 lorsqu'il s'agira du caractère "3" suivi du caractère "2" (on parle alors de chaîne de caractères). - Toutes les lettres de l'alphabet "occidental" se trouvent présentes, en versions majuscule (#41 à #5A) et minuscule (#61 à #7A). Les plus pénétré(e)s par la base 2 auront même remarqué que, transcrit en binaire, le code d'un caractère majuscule ne diffère du code de sa version minuscule que par son bit n°5Exemple pris au hasard:
A majuscule - code #41 (01000001)
a minuscule - code #61 (01100001) - Remarque toute chauvine: nous sommes apparemment priés de remettre nos chers é, è, ê, à, ô, û et autre ë dans notre culotte tricolore.
A vrai dire, nous n'en attendions pas mieux de la part d'une table de référence 100% ricaine...
Il est vrai que les caractères de la table ASCII sont codables sur sept bits. Mais, comme nous le disions, la table ASCII est une création quasi préhistorique, bien antérieure à l'avènement de l'octet comme unité générique de l'information binaire.
Qui plus est, même aux premiers temps de l'octet roi, les ordinateurs et réseaux informatiques d'alors n'avaient pas la fiabilité de nos binious actuels et d'Internet, et le huitième bit pouvait alors précieusement servir de bit de parité, c'est-à-dire, pour parler normalement, de moyen de contrôle de l'exactitude des sept autres bits.
Ceci peut s'expliquer... En fait, la table de référence ASCII est un standard si indiscutable et si universellement adopté que:
- la quasi totalité des tables de référence plus récentes, comme nous le verrons, ont pris pour sage décision de reprendre in extenso la table de référence ASCII...c'est-à-dire les mêmes caractères, associés aux mêmes codes., en y ajoutant d'autres caractères sélectionnés selon des critères généralement linguistiques
- l'expression "fichier ASCII" est devenue, de manière impropre mais néanmoins totalement passée dans les moeurs numériques, un raccourci fort pratique pour désigner un fichier texte ayant été encodé à l'aide de la table ASCII originelle ou de l'une de ses multiples versions étendues.
La nuance est d'importance puisqu'un fichier constitué d'un texte encodé, par exemple, à l'aide de la table de référence ASCII étendu latin/cyrillique peut parfaitement prétendre au qualificatif de "fichier ASCII". Or, si ledit fichier ne précise pas son format d'encodage ou s'il le précise mais que votre ordinateur ne dispose pas de cette table de référence ou d'une police de caractères permettant l'affichage des caractères slaves, son contenu apparaîtra si ce n'est illisible, du moins incomplet, les seuls caractères préservés étant ceux appartenant à la table ASCII originelle.
Heu...compris ?
La table ASCII devint rapidement si incontournable que l'organisme supranational et normalisateur ISO (International Organization for StandardizationOui, ceci fait effectivement IOS, et non pas ISO. Mais c'est parce que ISO n'est pas un acronyme, mais un clin d'oeil au préfixe grec iso, qui signifie "égal".) l'inclut bien vite parmi ses indiscutables standards, sous le nom fort poétique de ISO 646.
Néanmoins, de par son rôle international, l'ISO "désaméricanisa" quelque peu la table ASCII en permettant sa déclinaison en différentes variantes nationales. A cette fin, plusieurs codes de la table originale, correspondant aux caractères parmi les moins usités, furent laissés à la disposition des diverses langues étrangères. Ainsi, par exemple, la déclinaison NF Z 62-010, alias ISO 646-FR, se trouvait à peu près taillée pour la langue de Molière.
Dès lors, tout le Monde était heureux et fier de disposer ainsi de sa propre table ASCII, douillette et customisée. L'époque, il est vrai, n'était pas encore au village global et au serveur off-shore...
Extension d'un bit: les tables ASCII étendu
Les successives générations d'ordinateurs et, dans le même temps, les dispositifs de transmission numérique gagnant en fiabilité, le bit de parité perdait peu à peu de son utilité et l'idée de le dédier comme ses sept autres collègues au codage proprement dit laissait augurer de nouvelles tables de référence deux fois plus vastes...puisque si 7 bits permettent de coder 27 caractères, 8 bits permettent d'en coder deux fois plus (28).
La table ASCII étant devenue incontournable, il n'était pas question de bouleverser les 128 codes déjà assignés mais simplement d'ajouter à ceux-ci 128 autres caractères qui permettraient ainsi d'obtenir des tables ASCII étendu (Extended ASCII), totalement compatibles avec leur aïeule.
Oui mais voilà: à quelles lettres dédier ces nouveaux espaces providentiels ? Au "ê" français ? au "Ø" suédois ? au "ß" allemand ? au "‡" saturnien ? Quelle que fût la décision, les déçus eussent été nombreux...
Quoi qu'il en fût, cantonnés à des valeurs comprises entre 0 et 255, l'encodage des caractères ASCII étendu restait toujours aussi évident, chaque code étant directement transcriptible en un octet.
Les tables d'OS
IBM et Microsoft, premiers à table
En 1981, une petite société américaine du nom d'IBM s'apprête à engranger du dollar en lançant son dernier bébé: le PC-AT, ordinateur révolutionnaire dont l'une des caractéristiques qui nous intéresse plus particulièrement ici est l'adoption, pour la première fois, d'une table de référence par défaut codée sur huit bits.
Dans le sillage d'IBM, une autre petite société du nom de MicrosoftUn exemple pour tous les sous-traitants de la planète... est sollicitée afin de fournir une interface logicielle à la bête. Celle-ci crée donc pour l'occasion une application originaleLes avis divergent un peu sur cet épithète... qu'elle baptise DOS (Disk Operating System), ou, pour parler en ASCII-FR, système d'exploitation de disque.
Parmi les fonctionnalités du DOS, la très agréable possibilité de charger au démarrage de la machine une table de référence de son choix, permettant ainsi à chaque utilisateur de retrouver son alphabet national ainsi que tous ses caractères spécifiques...quand y'en a pour DOS, y'en a pour toi.
(pathétique).
Plusieurs langues à la même table
Il est somme tout fréquent de voir confondues les notions de langages et de tables de référence. De fait, la confusion est maladroite car une même table de référence est susceptible de décrire les caractères de plusieurs langues, non nécessairement voisines. Ainsi, par exemple, notre page de code 850 permet de parfaitement s'exprimer tant en Français qu'en Anglais ou en Italien.
A cette fin, différentes tables de référence, baptisées pour l'occasion pages de code (codepage) furent mises au point, de manière plus ou moins pertinente et linguistiquement sensée.
Ainsi, tandis que la page de code 437, également baptisée Extended ASCII OEM (Original Equipment Manufacturer) constituait la page de code par défaut...c'est-à-dire américaine., nous, heureux Européens occidentaux, nous voyions proposée la codepage 850, dite "multilingual latin-1".
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D | 0E | 0F | |
| 0 | NUL | ☺ | ☻ | ♥ | ♦ | ♣ | ♠ | • | ◘ | ○ | ◙ | ♂ | ♀ | ♪ | ♫ | ☼ |
| 1 | ► | ◄ | ↕ | ‼ | ¶ | § | ▬ | ↨ | ↑ | ↓ | → | ← | ∟ | ↔ | ▲ | ▼ |
| 2 | espace | ! | " | # | $ | % | & | ' | ( | ) | * | + | , | - | . | / | 3 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
| 4 | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
| 5 | P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ^ | _ |
| 6 | ` | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
| 7 | p | q | r | s | t | u | v | w | x | y | z | { | | | } | ~ | ⌂ |
| 8 | Ç | ü | é | â | ä | à | å | ç | ê | ë | è | ï | î | ì | Ä | Å |
| 9 | É | æ | Æ | ô | ö | ò | û | ù | ÿ | Ö | Ü | ¢ | £ | ¥ | ₧ | ƒ |
| A | á | í | ó | ú | ñ | Ñ | ª | º | ¿ | ⌐ | ¬ | ½ | ¼ | ¡ | « | » |
| B | ░ | ▒ | ▓ | │ | ┤ | ╡ | ╢ | ╖ | ╕ | ╣ | ║ | ╗ | ╝ | ╜ | ╛ | ┐ |
| C | └ | ┴ | ┬ | ├ | ─ | ┼ | ╞ | ╟ | ╚ | ╔ | ╩ | ╦ | ╠ | ═ | ╬ | ╧ |
| D | ╨ | ╤ | ╥ | ╙ | ╘ | ╒ | ╓ | ╫ | ╪ | ┘ | ┌ | █ | ▄ | ▌ | ▐ | ▀ |
| E | α | ß | Γ | π | Σ | σ | µ | τ | Φ | Θ | Ω | δ | ∞ | φ | ε | ∩ |
| F | ≡ | ± | ≥ | ≤ | ⌠ | ⌡ | ÷ | ≈ | ° | ∙ | · | √ | ⁿ | ² | ■ | nbs...c'est-à-dire no-break space, ou plutôt "espace dur". Ainsi qualifie-t-on un espace séparant deux mots dont on ne veut pas qu'ils soient séparés par un inopportun retour à la ligne. |
Attention ! Selon votre configuration personnelle, respecté(e) lecteur(trice), il est somme toute possible que certains caractères de ce tableau ne s'affichent pas correctement. Reste à vous tourner alors vers la version image de cette table, cachée ci-dessous.
Bon, on pourra toujours chipoter qu'il manque l'indispensable "e dans l'o", mais l'effort reste louable...
ASCII divers
En fait, oui. Et c'est pour cela que nous avons précisé qu'il s'agissait ci-dessus de la version "graphique" de la page de code 850. En pratique, les caractères de contrôle étaient toujours exprimables par leur code ASCII originel, mais apparaissant dans un contexte graphique...comme, par exemple, un éditeur de texte., ces codes perdaient leur signification originelle, de toute façon de plus en plus désuette, et apparaissaient alors sous ces formes délicieusement naïves.
Vous voulez sans doute parler de ces curieux symboles disséminés entre #B0 (176) et #DF (223) ?
Très simple. Même si la chose aujourd'hui semble inconcevable, le DOS était un système d'exploitation dit "en ligne de commande". En clair, ni icône, ni cliquer-glisser, ni jolie fenêtre redimensionnable. Les commandes DOS se résumaient à quelques ordres concis, entrés au clavier et exécutés avec la touche entréeLe bon temps, quoi..
L'incorporation de ces quelques symboles graphiques aux tables ASCII étendu permettaient néanmoins aux applications de pouvoir dessiner des fenêtres basiques, des tableaux, voire même des dessins certes rudimentaires mais du plus bel effet (pour l'époque)Certains grands malades s'illustrèrent même brillamment dans une nouvelle forme d'art moderne: "l'ASCII Art"..
Les tables par la Fenêtre®
En 1990, les dirigeants de Microsoft, qui ont tranquillement prospéré sur leur DOS...technique commerciale reprise depuis avec un certain succès par C. Morgane et, dans le secteur public, C. Deviers-Joncourt..., assurent définitivement l'avenir de leur progéniture en commercialisant la version 3 de leur système d'exploitation graphique, baptisé Windows.
Celui-ci innove sur de nombreux points...dont plusieurs points très librement inspirés par le MacOS de la crémerie d'en face..., dont l'adoption d'une nouvelle table de référence par défaut baptisée Windows-1252, ou WinLatin1, ou encore ANSI...de manière d'ailleurs totalement impropre puisque l'ANSI (American National Standards Institute) n'ayant jamais validé cette table de référence..
Attention ! Même remarque que précédémment quant à l'éventualité de ne pas pouvoir visualiser certains caractères, et le recours conséquent à la version image de cette table.
Notons au passage que certains codes - marqués d'un fond rouge - sont tout bonnement non attribués, et compâtissons à la brutale disparition des caractères graphiquesWindows étant un système d'exploitation 100% graphique, ceux-ci n'avaient effectivement plus raison d'être... de la page de code 850.
Tiens, on va enfin pouvoir écrire des œufs...et même des ŒUFS d'autruche ! correctement...
ASCII d'ALTitude
Avant toute chose, prenez bien soin de vous, car vous êtes manifestement une espèce en danger.
Ensuite, il existe une petite astuce qui, hélas, ne marche pas en toute circonstance...et en tout cas uniquement sous Windows. mais suppose que vous émétiez d'abord une préférence pour la page de code 850 ou la page de code 1252.
Ensuite, la procédure diffère selon votre choix:
- Afin de pouvoir afficher à l'écran un caractère de la page de code 850, il suffit (!) de taper son code décimal à trois chiffres sur le pavé numérique en laissant appuyé le doigt sur la touche ALT du clavier. Ainsi, par exemple, le ç majuscule, codé par le code 128 (#80) sera-t-il affiché en appuyant sur ALT puis en appuyant successivement sur les touches 1, 2 puis 8.
Démonstration: Ç. - Afin de pouvoir afficher à l'écran un caractère de la page de code 1252, la procédure est quasi identique, sauf qu'il faudra cette fois taper le code correspondant à ladite page en précédant ce code d'un zéro. Ainsi, par exemple, le ç majuscule, codé cette fois par le code 199 (#C7) sera-t-il affiché en appuyant sur ALT puis en appuyant successivement sur les touches 0, 1, 9 puis encore 9.
Pour preuve: le tableau ci-dessus a été entièrement rempli à la main par cette méthode !
ISO-8859: huit bits et tant de langues !
Tout comme il le fit pour la table ASCII originale, l'ISO établit de son côté une liste de tables de référence dédiées à différents alphabets sous le nom générique de norme ISO-8859.
Toutes ces tables se trouvaient basées sur la même ossature:
- Les 128 premiers caractères (#0-#7F) étaient intégralement repris depuis la table ASCII originelle...qui constituait dès lors un sous-ensemble de ces nouvelles tables.,
- Les 32 codes suivants (#80-#9F) étaient attribués à des caractères de contrôle, regroupés sous le terme générique de caractères de controles C1...pour les distinguer des caractères de contrôle de l'ASCII (#00-#1F), appelés, eux, caractères de contrôle C0. mais généralement inutilisés dans les conditions habituelles d'usage de ces tables,
- Les 96 derniers codes (#A0-#FF) étaient attribués à divers jeux de caractères établis de telle manière que les tables correspondantes recouvrent plusieurs alphabets liés à des zones linguistiquement voisines.
Pour toutes celles et ceux que la computo-linguistique passionne, on ne peut que conseiller le site incontournable de Roman Czyborra, spécialiste mondial de la table de référence ISO-8859, et de deux ou trois autres trucs...
Ainsi, la table ISO-8859-1, également appelée Latin-1, nous concerne-t-elle plus particulièrement puisqu'elle compilait les caractères dits "occidentaux", ou du moins ceux requis par la quasi totalité des langues d'Europe occidentale.
Remarquons, hormis pour la plage #80-#9F particulière, la très grande ressemblance entre cette table ISO-8859-1 et la table Windows-1252.
D'autres tables moins étoilées
La table ASCII et ses versions étendues ne sont pas les seules tables de référence gravitant dans la galaxie informatique. En voici quelques autres, plus ou moins célèbres.
Mac OS Roman: le jeu de Pomme®
Comme son nom l'indique, la table de référence Mac OS Roman est l'équivalent de la page de code Windows-1252, mais vu par la créature la plus célèbre de la société Apple: le Macintosh.
Pour constituer cette table, les 128 premiers caractères ont été intégralement copiés sur la table ASCII, les 128 suivants attribués à différents caractères ci-dessous listés:
| 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D | 0E | 0F | |
| 8 | Ä | Å | Ç | É | Ñ | Ö | Ü | á | à | â | ä | ã | å | ç | é | è |
| 9 | ê | ë | í | ì | î | ï | ñ | ó | ò | ô | ö | õ | ú | ù | û | ü |
| A | † | ° | ¢ | £ | § | • | ¶ | ß | ® | © | ™ | ´ | ¨ | ≠ | Æ | Ø |
| B | ∞ | ± | ≤ | ≥ | ¥ | µ | ∂ | ∑ | ∏ | π | ∫ | ª | º | Ω | æ | ø |
| C | ¿ | ¡ | ¬ | √ | ƒ | ≈ | ∆ | « | » | … | nbs...c'est-à-dire no-break space, ou plutôt "espace dur". Ainsi qualifie-t-on un espace séparant deux mots dont on ne veut pas qu'ils soient séparés par un inopportun retour à la ligne. | À | à | Õ | Œ | œ |
| D | – | — | “ | ” | ‘ | ’ | ÷ | ◊ | ÿ | Ÿ | / | € | ‹ | › | fi | fl |
| E | ‡ | · | ‚ | „ | ‰ | Â | Ê | Á | Ë | È | Í | Î | Ï | Ì | Ó | Ô |
| F | ð | Ò | Ú | Û | Ù | ı | ˆ | ˜ | ¯ | ˘ | ˙ | ˚ | ¸ | ˝ | ˛ | ˇ |
EBCDIC: une table à l'écart
La table de référence EBCDIC (Extended Binary Coded Decimal Interchange Code) est une curiosité en elle-même puisqu'il s'agit d'une des très rares tables de référence qui, bien qu'également codée sur huit bits, soit absolument incompatible avec le standard ASCII.
Conçue par IBM pour IBM, et plus particulièrement pour ses mainframesTerme anglais, immédiatement ridicule dès que traduit en Français, désignant les très gros ordinateurs que seules peuvent s'offrir les très grosses sociétés en très gros besoin de puissance de calcul., la table EBCDIC a entre autres particularités d'avoir été conçue dans l'unique optique de faciliter le travail de la machine, et, par conséquent, en dépit de tout bon sens humanoïde. Ainsi, par exemple, les caractères alphabétiques ne se suivent-ils pas de manière... alphabétique mais sont disposés de façon à faciliter la production de cartes perforées.
EBCDIC vs ASCII
Pour les quelques fans du jeu de caractères EBCDIC, un petit exposé assez exhaustif sur son avantage et ses inconvénients.
Vous l'aurez compris, la table EBCDIC date un peu et n'est plus guère évoquée hors des limites territoriales de la cafet' de la firme, et en tout cas jamais par la plèbe de l'informatique personnelle.
Unicode: Tout le Monde à la même table !
Les différentes déclinaisons nationales de la table ASCII étendu constituaient une entreprise louable de permettre à tout à chacun de tapoter du texte dans sa langue maternelle, mais souffraient dans le même temps de contraintes rédhibitoires de plus en plus incompatibles avec la mondialisation galopante des échanges. Plus précisément:
- La multiplicité des tables de référence rendait aléatoire la cohérence entre phases d'encodage et de décodage d'un texte source. Ainsi, pour exemple, un texte écrit à Moscou, et encodé à l'aide de la table ISO-8859-5, perdait tout sens lorsque lu à Londres, Bombay ou bien PékinEt on ne vous parle pas d'un texte rédigé sur Mac au rez-de-chaussée, et lu sur pécé au premier étage....
- Le confinement à des tables de 256 caractères excluait non seulement d'emblée les peuples dotés d'alphabets plus conséquents, mais empêchait jusqu'à mixer dans un même texte des caractères issus de langues différentes.
Non... L'idéal, ce serait une table unique et géante contenant tous les caractères de toutes les langues de l'Humanité...
Vous en rêviez ? Unicode l'a fait !
ISO-10646 / Unicode: le projet Babel
Au début des 1990, deux organismes se lancent en parallèle dans une entreprise d'envergure au but similaire.
Le premier, et c'est plutôt son rôle, est l'organisme ISO qui, sous le nom de norme ISO-10646, projette de définir un jeu de caractère universel (Universal Character Set) afin de pallier aux limitations inhérentes aux pages de code traditionnelles.
Dans le même temps, un consortium américain à but non lucratifNon, non, sans rire. baptisé Unicode, entreprend la même aventure, mais avec le souci plus ambitieux de définir également des méthodes normalisées de gestion des écritures et des caractères.
Très vite, heureusement, les deux organismes unissent leurs efforts en acceptant de faire répertoire commun, et en juillet 2006, le consortium américain publie Unicode 5.0, dernière révision majeure de ses travaux.
De fait, contrairement aux précédentes entreprises où l'on tentait, forcément imparfaitement, de faire tenir le plus de caractères utiles dans une table de référence de taille réduite, les projets ISO-10646 et Unicode prenaient le problème à contre-pied, le but principal devenant la définition d'un "abécédaire" le plus exhaustif possible, à charge par la suite de définir des méthodes d'encodage nécessaires à son exploitation.
Tous les efforts du consortium Unicode concourent à satisfaire les dix principes fondamentaux ci-dessous listés, mais avec le souci constant de ne pas sacrifier la simplicité à l'exhaustivité, et tout en recherchant une compatibilité maximale avec les anciens standards.
Bref, une véritable sinécure...
- Le standard Unicode propose un répertoire unique et universel...limité quand même aux seules langues écrites et suffisamment connues pour être correctement décrites.;
- Un texte au format Unicode doit être simple à analyser et à manipuler...et donc dépourvu de tout code d'échappement tarabiscoté...;
- Le standard vise le codage de caractères "abstraits" et non de glyphes...un même caractère pouvant être représenté par une ou plusieurs glyphes (les lettres arabes, par exemple, disposent de plusieurs représentations selon leur position dans le mot)...;
- Tout caractère ou symbole du répertoire a une valeur sémantique décrite par des propriétés permettant son analyse (tri, directionnalité, potentiel combinatoire...);
- Unicode ne prend en charge que le texte brut...et donc sans considération de son formatage ou d'éventuels liens hypertextes attachés.;
- Unicode encode tout texte dans un ordre "logique" correspondant au sens de lecture ou d'écriture de la langue dans laquelle est rédigé le texte;
- Le standard vise à l'unification des caractères et symboles communs à plusieurs langues...communs mais de même valeur sémantique. Ainsi, le "o" latin, le "o" cyrillique et le omicron grec, bien que généralement représentés de manière très voisine par la plupart des polices de caractères, seront néanmoins codés différemment par Unicode de par leur appartenance à des écritures différentes., indépendamment de leur usageAinsi, le symbole virgule (,) bien qu'utilisé à la fois comme signe de ponctuation, séparateur des milliers (en Anglais) ou séparateur décimal (en Français) ne sera représenté que par un seul point de code.. Néanmoins, certaines redondances peuvent être introduites à des fins de compatibilité avec d'anciens standards;
- Unicode reconnaît et gère les combinaisons...tant les combinaisons statiques (c'est-à-dire linguistiquement usuelles, que Unicode recense et normalise) que les combinaisons dynamiques (c'est-à-dire "extemporanées") de caractères. Certains caractères, essentiellement à des fins de compatibilité, existent sous forme pré-assemblée mais peuvent également être encodés par combinaison de deux ou plusieurs caractèresAinsi, le symbole "c cédille" (ç) peut être codé sous forme pré-assemblée (U+00E7) mais également par combinaison des caractères "c" (U+0063) et "cédille" (U+0327). unités;
- Bien que susceptible d'être constamment enrichi, le répertoire Unicode se doit d'être stable: tout caractère assigné l'est définitivement et ne peut donc plus être ni déplacé ni supprimé;
- Tout encodage Unicode est convertible vers un certain nombre de standards pré-existants;
Une table qui ne manque pas de caractères
Bien évidemment, le fruit le plus spectaculaire et le plus symbolique des travaux du consortium Unicode reste sa table de référence. Celle-ci, en constante évolution...mais en respectant une scrupuleuse compatibilité ascendante, de telle manière que les versions plus anciennes du standard restent compatibles avec la dernière en date. , compile - pour sa dernière version - près de cent mille caractères à chacun desquels sont associés:
- un identifiant descriptif en anglaisOui, le consortium Unicode, allez savoir pourquoi, n'a pas repris à son compte le bilinguisme anglais/français de rigueur chez l'ISO...;
- un numéro unique d'identification, appelé point de code (codepoint) exprimé en base hexadécimale et compris entre U+0000 et U+10FFFF;
- un modèle graphique indicatifIndicatif car, nous le rappelons, l'aspect réel du caractère dépendra de la police de caractères à laquelle il sera finalement associé..
| Point de code | Caractère |
Identifiant |
| U+0034 | 4 |
DIGIT FOUR |
| U+0041 | A |
LATIN CAPITAL LETTER A |
| U+00C7 | Ç |
LATIN CAPITAL LETTER C WITH CEDILLA |
| U+03A3 | ∑ |
GREEK CAPITAL LETTER SIGMA |
| U+221A | √ |
SQUARE ROOT |
La table de référence Unicode se subdivise en différentes parties de taille identique appelées plans...les fameux plans de table.... Le premier d'entre eux, et le plus important, compris entre les points de code U+0000 et U+FFFF constitue le plan multilingue de base (PMB):
Cliquez sur les différentes zones du PMB pour accéder à la description des symboles correspondants sur le site officiel du consortium Unicode.
C'est quand même fou le monde qu'il y a sur cette planète...
| Points de code | Plan | Caractéristiques |
| U+0000 - U+FFFF | Plan Multilingue de Base | Le plus complet de tous les plans de la table Unicode, il rassemble la majorité des caractères utilisés dans les principales langues écrites contemporaines. |
| U+10000 - U+1FFFF | Plan Multilingue Supplémentaire | Plan occupé par divers symboles mathématiques et musicaux, et par différentes écritures anciennes (Linéaire B, Perse ancien, Phénicien...) |
| U+20000 - U+2FFFF | Plan Idéographique Supplémentaire | Plan essentiellement occupé par une pléthore d'idéographes unifiés pour les langues chinoise, japonnaise et coréenne. |
| U+30000 - U+DFFFF | Plans inutilisés | Plans dont les points de code n'ont pas (encore) été attribués. |
| U+E0000 - U+EFFFF | Plan Particulier Suppl. | Caractères non graphiques spécialisés. |
| U+F0000 - U+10FFFF | Plans à Usage Privé | Plans A et B réservés à l'usage privé de partis tiers. |
Permettons-nous tout de suite quelques petites réflexions sur ce répertoire universel:
Statistiquement parlant, le répertoire Unicode version 5.0 c'est:
- 98.884 caractères graphiques,
- 140 caractères de formatage,
- 65 caractères de contrôle,
- 137.468 points de code à usage privé,
- 2.048 points de code d'indirection...dont nous découvrirons l'utilité lorsqu'il s'agira d'encoder tout ce petit monde...,
- 66 points de code réservés,
- 875.441 points de code non encore assignés.
- Malgré son petit côté révolutionnaire, le répertoire Unicode est bâti sur des fondations plutôt anciennes puisque nous constatons que les 256 premiers points de code (U+0000 - U+00FF) correspondent exactement aux caractères codés par la table de référence ISO 5589-1;
- Le répertoire est doté d'un certain potentiel: 17 plans de 65.536 codes, soit 1.114.112 points de code disponibles, dont seuls 238.671 (21,4%) déjà assignés;
- Le standard Unicode a réservé un grand nombre de points de code à un "usage privé"; ces espaces sont mis à disposition des concepteurs d'application, fabricants et autres manufacturiers afin qu'ils puissent y définir leurs propres codes...qui ne feront bien évidemment pas partie du standard proprement dit..
Unicode en pratique
Un répertoire, trois encodages
Bien ! Nous avons jusqu'à présent décrit Unicode comme un excellent standard de description et de manipulation des caractères textuels, mais n'oublions pas que le but de cette page est quand même l'étude du codage binaire du texte, aspect que nous n'avons pas même encore effleuré.
Une chose est sûre: avec plus de 1.100.000 codes différents, ce ne sont pas moins de 21 bits...puisque 20 bits ne permettraient de coder "que" 1.048.576 caractères (220). qui devraient être nécessaires à l'encodage de nos caractères Unicode.
Les tables de référence "pré-Unicode" étaient certes ridiculement exiguës, mais leur encodage ne posait aucun problème, tout code étant inférieur à 256 et, donc, très facilement représentable sous la forme d'un simple octet. Avec Unicode, le problème de l'encodage se corse sérieusement !
Heureusement, le projet Unicode ne s'est pas limité au recensement des caractères du monde, il s'est également penché sur le problème de leur encodage binaire et, à ce titre, a prévu trois principaux formats "transformés", baptisés UTF (Unicode Transformation Format) destinés à adapter Unicode aux multiples situations de la vie quotidienne d'un ordinateur normal.
Bien que très différents dans le résultat qu'ils produisent, ces formats d'encodage partagent tous un principe intangible: tout point de code Unicode doit pouvoir être retrouvé sans ambiguïté à partir de sa version transformée, et cette obligation s'étend également à d'éventuels caractères invalidesAinsi, tout point de code, même s'il correspond à une valeur non attribuée du répertoire, doit être transformé en une séquence telle que ce point de code puisse être exactement retrouvé lors du décodage de la séquence..
Unicode gère (aussi) les oeufs à la coque
Avec le problème de l'encodage des caractères Unicode resurgit une question vieille comme l'octet au pays fantastique des puces savantes, à savoir: "par quel bout entamer ses oeufs à la coque ?"Oui, c'est vrai, la question peut surprendre... Mais tout s'éclaire au bout de ce lien..
De manière un tantinet plus explicite, le problème peut se poser en ces termes: lorsqu'il s'agit de transmettre une donnée binaire composée de plusieurs octets (par exemple 89 AB CD EF) dans un flux de données, comment diable faut-il procéder: doit-on commencer par les octets de poids forts (89-AB-CD-EF) ou par les octets de poids faible (EF-CD-AB-89) ?
La question peut paraître dérisoire mais le fait est que les processeurs n'attendent pas tous les octets de la même manière ! Mieux vaut donc trouver un moyen fiable de s'entendre sur ce point, de telle manière qu'un texte compréhensible le reste, justement, en passant d'une machine à l'autre.
Soucieux de ne surtout pas prendre parti...et, à vrai dire, de rester un standard le plus ouvert possible. dans cette querelle immémoriale, le consortium Unicode propose trois variantes de ses différents formats transformés UTF:
- Un format UTF-BE (pour "Big Endian"...c'est ainsi que l'on dénomme les ordinateurs qui mangent leurs oeufs à la coque par le gros bout...) pour lequel les octets seront transmis dans un ordre décroissant de poids,
- Un format UTF-LE (pour "Little Endian"...comme on appelle les ordinateurs du clan d'en face.
Logique...) pour lequel les octets seront transmis dans un ordre croissant de poids, - Un format UTF "indéterminé" pour lequel on devra indiquer en tout début de fichier la solution adoptée, grâce à une séquence particulière joyeusement appelée BOM (Byte Order Mark) et composée de points de code réservés à cet effet...parmi les 66 points de code que le standard s'est auto-attribué pour ses propres besoins..
L'encodage au choix
UTF-32: Unicode "no limit"
Le format UTF-32 est à la fois le plus simple et le plus gourmand des formats d'encodage de l'Unicode. Le plus simple car ici, tout point de code Unicode est directement codé en sa valeur binaire sur 32 bitsOui, c'est exact qu'en théorie, 21 bits suffiraient largement à coder les 1.114.112 points de code du répertoire, mais l'ordinateur est vraiment très attaché aux octets., l'encodage revenant alors à une simple conversion entre hexadécimal et binaire.
En contrepartie, ce format se révèle également le plus gourmand en ressources puisque chaque caractère, que ce soit un "e" quasi-universel ou un idéogramme médiéval sub-indonésien nécessitera quatre octets pour être codé.
A ce titre, le format UTF-32 est le seul format transformé Unicode pouvant être qualifié d'encodage "à taille constante".
Simple, donc, mais dispendieux !
Précisons, pour être complet, que le BOM UTF-32BE est 00-00-FE-FF, et le BOM UTF-32LE FF-FE-00-00Oui, c'est sûr que si vous avez sauté quelques lignes avant d'atterrir ici, ce genre de phrase peut perturber...
UTF-8: Unicode orienté Internet
Le nom même d'encodage UTF-8 est évocateur puisqu'il vise précisément à sérialiser tout caractère Unicode uniquement à l'aide d'octets: un, deux, trois ou quatre selon le point de code de celui-ci.
L'objectif semble raisonnable: si un seul octet peut suffire à coder un caractère donné, pourquoi s'escrimer à en pondre quatre ? Dans les faits, l'encodage UTF-8 pose néanmoins quelques sérieux problèmes...
Et pourtant ! Il semblerait si simple de convertir des points de code en octets: un point de code compris entre U+0000 et U+00FF serait codé par un seul octet (de 00 à FF) - un point de code compris entre U+0100 et U+FFFF par deux octets (de 01-00 à FF-FF), et ainsi de suite pour les plans supérieurs...
Oui mais voila: le standard Unicode fuit l'ambiguité comme la peste et exige qu'en prenant au hasard un octet dans une séquence codée en UTF-8, on puisse de manière infaillible établir si celui-ci code à lui seul un caractère ou s'il fait partie d'une séquence.
Pfffff... Ça va pas être simple...
Afin de convertir un point de code en octet(s), la norme UTF-8 se sert d'une méthode somme toute pas évidente mais redoutablement efficace, et magistralement mise en lumière par le tableau suivant:
Chaque petit "#" symbolise un bit de valeur quelconque.
Comme d'habitude, petit décryptage de tableau sibyllin:
- De par le mécanisme d'encodage UTF-8, il est facile de constater qu'un texte au format ASCII est de facto un texte au format UTF-8, mais, bien évidemment, l'inverse n'est absolument pas vrai.
- Les bits les plus significatifs du premier octet d'une séquence donnent la longueur de la séquence: 110 pour une séquence de deux octets, 1110 pour une séquence de trois octets, 11110 pour une séquence de quatre octets.
- Tout octet dont les deux bits les plus significatifs sont "10"...c'est-à-dire un octet de valeur comprise entre #80 et #BF. est un octet appartenant à une séquence.
- De par l'algorithme de transformation UTF-8, il est normalement impossible de trouver dans une séquence UTF-8 un octet égal à C0, C1, F5, F6, F7, F8, F9, FA, FB, FC, FD, FE ou FF.
Le principal avantage du format UTF-8 tient dans sa compacité, quasi parfaite..."quasi" de par les exigences du standard vis-à-vis de la non-ambiguité des séquences., qui en fait un format idéal dans le contexte en plein boom des télétransmissions informatiquesAucune surprise, donc, en apprenant que le format UTF-8 est le format d'encodage par défaut des documents XML..
La contrepartie est plus insidieuse car un caractère pouvant être codé par un nombre variable d'octets, les routines de manipulation de chaînes...à savoir calcul de longueur, extraction, tri et le toutim... sont rendues sensiblement moins rapides.
UTF-16: Unicode orienté OS
Il est évident que parmi tous les caractères recensés par le standard Unicode, ceux appartenant au Plan Multilingue de Base s'avèrent, et de loin, les plus usités. Or, les caractères du PMB s'étendant entre U+0000 et U+FFFF, deux octets pourraient suffire à coder la totalité d'entre eux.
De ce constat limpide est né le principe du codage UTF-16, qui vise simplement à décomposer les caractères Unicode en seizetJoli mot, non ?
Plus joli en tout cas que "séquence de seize bits"... binaire.
Mais les pointilleux se trémoussent déjà ! Et les caractères situés hors du PMB ? Les zapperait-on dans la joie ? Du tout, du tout: on continue de les coder, mais cette fois sous forme de deux seizets appelés seizets d'indirection (surrogate pairs en Grand-Breton).
A l'image du format UTF-8, le consortium Unicode a conçu son encodage UTF-16 de telle manière que les seizets d'indirection ne prêtent à aucune équivoque. En ce sens, l'éventail des valeurs possibles pour un seizet simple est complètement disjoint de l'éventail des valeurs possibles pour chacun des deux seizets d'indirection.
En termes beaucoup plus clairs, tout caractère situé hors du PMB sera encodé par deux seizets d'indirection: un premier, obligatoirement compris entre les valeurs D800 et DBFF, et un second, tout aussi obligatoirement compris entre les valeurs DC00 et DFFF, l'espace U+D800 - U+DFFF du PMB n'étant par définition attribué à aucun caractère.
La conséquence de ce mode d'encodage est heureuse: si, en consultant une séquence de caractères encodée au format UTF-16, vous trouvez un seizet:
- Compris dans les intervalles 0000-D7FF ou E000-FFFF, c'est qu'il s'agit obligatoirement d'un seizet codant un caractère du PMB;
- Compris dans l'intervalle D800-DBFF, c'est qu'il s'agit obligatoirement du premier seizet d'un caractère situé hors du PMB, qui doit donc être obligatoirement suivi par un seizet compris entre DC00-DFFF;
- Compris dans l'intervalle DC00-DFFF, c'est qu'il s'agit obligatoirement du second seizet d'un caractère situé hors du PMB, qui doit donc être obligatoirement précédé par un seizet compris entre D800-DBFF.
Le format UTF-16 semble donc un excellent compromis entre la lourdeur du format UTF-32 et la relative complexité du format UTF-8. Cet équilibre heureux fait de UTF-16 le format choisi par de nombreux systèmes d'exploitation...et notamment Windows, depuis sa version NT. pour leur représentation interne des chaînes de caractères.
Précisons ici aussi, toujours pour être complet, que le BOM UTF-16BE est FE-FF, et le BOM UTF-16LE FF-FEMême cause, même conséquence que plus haut...
Cliquez sur les chiffres du point de code pour modifier sa valeur et constater la valeur conséquente des différents formats d'encodage Unicode.
Bien ! Il semble qu'un ordinateur puisse, de manière laborieuse mais apparemment fiable, manipuler du texte, qui plus est dans toutes les langues connues de la planète.
Conservons quand même notre Remington sous le coude, juste au cas où le régime des retraites à EDF serait menacé...
Pour aller plus loin...




Si une ou plusieurs sommités venant à croiser ce site acceptaient d'endosser cette écrasante responsabilité de caution intellectuelle pour une ou plusieurs leçons, elles seraient grandement remerciées et leur nom bien évidemment gravé en lettres d'or en tête de page, leur assurant par là même gloire et renommée quasi planétaires.