Cours 2 : Encodage et représentation des caractères
<lgrobol@parisnanterre.fr>
Université Paris Nanterre
2024-01-22
Donnez des exemples.
Est-ce que « a » est un caractère ?
Dans l’image suivante, combien y a-t-il de caractères différents ?
« A » et « a », est-ce le même caractère ?
Dans la mémoire de ma machine, la phrase « Je reconnais l’existence du kiwi. » est représentée par la suite de nombres
74, 101, 32, 114, 101, 99, 111, 110, 110, 97, 105, 115, 32, 108, 39, 101, 120, 105, 115, 116, 101, 110, 99, 101, 32, 100, 117, 32, 107, 105, 119, 105, 46
Ou en binaire
1001010, 1100101, 100000, 1110010, 1100101, 1100011, 1101111, 1101110, 1101110, 1100001, 1101001, 1110011, 100000, 1101100, 100111, 1100101, 1111000, 1101001, 1110011, 1110100, 1100101, 1101110, 1100011, 1100101, 100000, 1100100, 1110101, 100000, 1101011, 1101001, 1110111, 1101001, 101110
Ces nombres sont-ils des caractères ?
La terminologie n’est pas standardisée, le concept de caractère est ambigüe et on distingue ces concepts :
En résumé : dans la mémoire de l’ordinateur, un fichier texte correspond à une série de caractères encodés, qui sont traduits en graphèmes, eux-mêmes représentés à l’écran par des glyphes qui sont ce que vous voyez.
Ce qui nous intéresse dans la suite, c’est la partie encodage et on utilisera avec assez peu de précaution le mot caractère, sauf quand la distinction est importante.
On l’a dit, un encodage de caractère, c’est une façon de représenter des caractères par des nombres ou des séries de nombres.
Le principe est simple : tout le monde se met d’accord pour décider d’une table de correspondance commune qui associe à chaque caractère un unique nombre et voilà.
En pratique, historiquement, ça n’a pas été si simple.
Pourquoi ? Deux raisons :
L’American Standard Code for Information Interchange est une des premières conventions d’encodages à être devenue une norme (de facto et de jure) à l’usage international.
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
⋅⋅0 | ⋅⋅1 | ⋅⋅2 | ⋅⋅3 | ⋅⋅4 | ⋅⋅5 | ⋅⋅6 | ⋅⋅7 | ⋅⋅8 | ⋅⋅9 | |
---|---|---|---|---|---|---|---|---|---|---|
00⋅ | NUL | SOH | STX | ETX | EOT | ENQ | ACK | BEL | BS | HT |
01⋅ | LF | VT | FF | CR | SO | SI | DLE | DC1 | DC2 | DC3 |
02⋅ | DC4 | NAK | SYN | ETB | CAN | EM | SUB | ESC | FS | GS |
03⋅ | RS | US | SP | ! | ” | # | $ | % | & | ’ |
04⋅ | ( | ) | * | + | , | - | . | / | 0 | 1 |
05⋅ | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; |
06⋅ | < | = | > | ? | @ | A | B | C | D | E |
07⋅ | F | G | H | I | J | K | L | M | N | O |
08⋅ | P | Q | R | S | T | U | V | W | X | Y |
09⋅ | Z | [ | \ | ] | ^ | _ | ` | a | b | c |
10⋅ | d | e | f | g | h | i | j | k | l | m |
11⋅ | n | o | p | q | r | s | t | u | v | w |
12⋅ | x | y | z | { | | | } | ~ | DEL |
Vive le TAL!
?085, 080, 088, 060, 051
?Est-ce que vous voyez un problème avec ASCII ?
Et est-ce que vous voyez une solution ?
La solution qui a été retenue au problème « je peux pas écrire dans ma langue ! » c’est en général d’utiliser le 8ème bit tout en gardant les mêmes caractères pour les nombres de 0 à 127.
Ce qui fait combien de caractères en plus ?
128 caractères de plus ça laisse de la place pour pas mal de trucs. Comme des lignes pour dessiner des tableaux ou un soleil ☼.
Évidemment ça n’est pas assez pour utiliser des systèmes d’ériture logographique ou même simplement pour tous les alphabets d’Europe.
La solution historique, c’est donc encore une fois que chaque constructeur définit ses propres extensions, évidemment incompatibles.
La norme ISO 8859 est une tentative de définir des jeux de caractères standardisés par région géographique. En particulier, ISO 8859-1, qui permet d’écrire la plupart des alphabets d’Europe de l’Ouest a connu un succès assez durable pour des raisons qu’on imagine aisément.
En particulier la version légèrement différente utilisée par Microsoft sous le nom de CP-1252 est encore utilisée par beaucoup de systèmes.
Il reste que la standardisation est difficile : en particulier il est nécessaire de transmettre l’encodage d’un document sous forme de métadonnée, ce qui :
En conséquence, surtout avec la démocratisation du Web, les confusions sont nombreuses et mènent souvent à des « mojibake ». Par exemple pour un certain nombre de sites web, mon nom légal est Loïc.
Et ça ne résout pas le problème des systèmes d’écriture logographiques pour lesquels des encodages différents sont nécessaires.
Unicode est une norme créée dans le but de résoudre ces problèmes : un système d’encodage unique pour tous les systèmes d’écritures.
https://unicode-table.com présente de façon agréable la liste des caractères Unicode.
Au tableau !
On ajoute un niveau de représentation : le point de code, un nombre, souvent noté en hexadécimal, qui correspond à la position d’un caractère dans la table Unicode mais n’est pas nécessairement sa représentation concrète sur la machine.
Ainsi le caractère « Я », « CYRILLIC CAPITAL LETTER YA » correspond au point de code U+042F (1 071) et est représenté en UTF-8 par le nombre 208 175 (D0 AF).
Pour voir les représentations concrètes, on peut ouvrir les fichier textes dans un éditeur hexadécimal comme https://hexed.it.
Unicode contient beaucoup de caractères, pour des raisons plus ou moins bonnes. Entre autre il contient à la fois des caractères combinants (par exemple des accents qui s’ajoutent au caractère précédent), mais parfois aussi des caractères déjà combinés. Ainsi « ñ » peut se représenter comme U+0068 (n) suivi de U+0303 (le tilde) ou directement comme U+00F1. La normalisation n’est pas un procédé simple…
À votre avis, en plus des diacritiques, quels autres caractères sont combinants ?
Pour compliquer encore les choses, certains caractères servent à marquer une combinaison de caractères non-combinants. Ainsi l’emoji « 🏳️⚧️ » est représenté comme la suite des caractères 🏳️, ZWJ et ⚧️, ZWJ (Zero Width Joiner) marquant une combinaison entre ces deux emojis.
À faire par exemple à l’aide de https://unicode-table.com, rendre vos réponses dans un fichier txt nommé utf.txt
.
préfère
.utf8.txt
et une encodée en windows-1252 sous le nom windows.txt
.é
et è
dans ces deux formats d’encodage.Rendre les deux fichier txt que vous avez créé, plus un fichier nommé 2.txt
qui contiendra votre réponse à la dernière question