Section 3.3

Représentation des caractères

Dans les sections précédentes, nous avons vu comment représenter des nombres entiers sous forme de codes binaires. Dans cette section, nous allons regarder différentes manières de représenter des caractères, c'est-à-dire des symboles comme les lettres de l'alphabet, les chiffres, les signes de ponctuation, etc. Nous commencerons par regarder le code ASCII, puis nous verrons comment représenter des caractères accentués à l'aide du code ISO-8859-1. Finalement, nous parlerons de l'Unicode et de l'UTF-8 afin de voir comment représenter des caractères de toutes les langues et tous les alphabet du monde.

Tous les codes présentés dans cette pages sont des codes pour représenter des caractères individuels. Pour encoder du texte, il suffira dans tous les cas de concaténer les codes des caractères qui composent le texte. C'est ce que le format de fichier .txt fait, comme nous le discuterons par la suite.

Code ASCII

Le code ASCII est un code binaire qui permet de représenter les caractères de l'alphabet latin, les chiffres arabes, ainsi que quelques caractères spéciaux. Le code ASCII est un code binaire de longueur 7, ce qui permet de représenter 128 caractères différents. Ci-dessous est présenté le code ASCII sous forme de tableau.

Caractère Mot Caractère Mot Caractère Mot Caractère Mot

Dans le tableau ci-dessus, les entrées dénotée d'un caractère grisé représentent des caractères de contrôle qui ne sont pas affichables. La fonction de ces caractères est assez anecdotique et dépasse le cadre de ce cours. L'entrée dénotée d'un caractère représente un espace.

! Remarque

ASCII est un acronyme pour American Standard Code for Information Interchange, ce qui signifie en français « Code standard américain pour l'échange d'information ». Ce code a été créé dans les années 1960 et est toujours utilisé de nos jours. Ce code a eu une grande influence sur les codes qui ont été créés par la suite.

Le code ASCII est un code binaire de longueur 7, ce qui permet de représenter 128 caractères différents. Parmi ces 128 caractères, on retrouve tous les caractères utilisés en anglais, les chiffres arabes, ainsi que quelques caractères spéciaux. Cependant, il existe des caractères qui ne sont pas représentés dans le code ASCII et qui sont utilisés dans d'autres langues. Par exemple, le caractère « é » n'est pas représenté dans le code ASCII, alors qu'il est utilisé en français. Le caractère « € » n'est pas non plus représenté dans le code ASCII, ni le caractère « 魅 ». Pour représenter ces caractères, il faudra donc utiliser d'autres codes, comme nous le verrons dans la suite de cette page.

Bien que le code ASCII soit un code de longueur 7, on l'utilise généralement avec des mots de longueur 8. En effet, les mots de longueur 8 sont plus faciles à manipuler sur un ordinateur que les mots de longueur 7. Pour cela, on préfixe le mot de code de chaque caractère par un bit à 0. Les textes qui sont encodés en ASCII utilisent donc généralement un octet par caractère.

Le code ASCII étant un code de longueur fixe, et donc par conséquent un code préfixe, il est possible de représenter un texte encodé en ASCII simplement en concaténant les mots de code de chaque caractère du texte à encoder sans avoir à ajouter de séparateur. C'est ce qui est fait en pratique.

Code ISO-8859-1

Pour pallier au problème de l'ASCII qui ne permet pas de représenter de nombreux caractères utilisés dans différentes langues, différents codes ont vus le jour dans différentes régions du monde. Dans les années 1980, en Europe occidentale, le code ISO-8859-1 a été adopté comme standard pour représenter la majorité des caractères utilisés dans les langues occidentales. Ce code est aussi appelé Latin-1.

Le code ISO-8859-1 est un code binaire de longueur 8 qui se base sur le code ASCII. Chaque caractère du code ASCII est représenté de la même manière dans le code ISO-8859-1, à l'exception près qu'il est précédé d'un zéro (pour passer de 7 à 8 bits). Cela a pour avantage de garder une compatibilité avec le code ASCII.

Ci-dessous se trouve une table qui montre les 128 derniers caractères du code ISO-8859-1, les 128 premiers étant repris du code ASCII.

Caractère Mot Caractère Mot Caractère Mot Caractère Mot

Dans la table ci-dessus, les entrées dénotée d'un caractère grisé représentent des caractères de contrôle.

! Remarque

L'entrée dénotée d'un caractère (mot de code 10100000) représentent l'espace inséquable, tandis que l'entrée dénotée d'un - (mot de code 10101101) représente le trait d'union conditionnel.

Le code ISO-8859-1 a quelques défauts, notamment le fait qu'il ne permet pas de représenter les caractères utilisés dans de nombreuses langues, comme le russe, le chinois, l'arabe, etc. La solution initiale a été de concevoir des codes spécifiques à chaque langue, mais cela a rapidement posé des problèmes de compatibilité. Cette méthode rend en effet impossible l'affichage de plusieurs langues dans un même document, étant limité à un seul code. Cette limitation est devenue de plus en plus problématique avec l'essor d'Internet et du Web.

De plus, avec la prolifération de différents codes, il est devenu difficile de savoir quel code a été utilisé pour encoder un texte. Il est principe impossible de savoir quel code est utilisé dans un document sans avoir recours à des indications explicites. En effet, une fois encodé, un document ne contient plus que des octets ; octets qui peuvent être interprétés de différentes manières. Cela peut mener à des problèmes de décodage. Certains logiciels peuvent essayer de déterminer le code utilisé en analysant les octets présents dans le texte encodé, mais cela n'est pas garanti de fonctionner.

À cause des ces problème, le code ISO-8859-1, bien qu'initialement très utilisé en Europe occidentale, a depuis été largement remplacé par Unicode et le code UTF-8 que l'on va aborder immédiatement.

Unicode

Unicode est un standard qui définit un nom et un indice (un nombre entier) pour chaque caractère utilisé dans les différentes langues du monde, et même divers symboles comme les émoticônes. Comme de nouveaux caractères sont ponctuellement ajoutés, Unicode est un standard en constante évolution. À l'heure de l'écriture de ces notes de cours, Unicode contient 149'186 caractères.

♣︎ Exemple

Dans le tableau ci-dessous, on trouve une sélection de caractères et leur indice en Unicode.

Caractère Indice Caractère Indice Caractère Indice Caractère Indice

Unicode n'est pas à proprement parler un code de caractères. En effet, il ne définit pas comment représenter les caractères, il se contente de leur donner un indice (un numéro). Pour pouvoir avoir un véritable code, il faudrait transformer cet indice, qui est un nombre entier, en une suite de bits (un mot de code). Le code UTF-8, que nous allons maintenant aborder, est un exemple de code pour les caractères définis en Unicode.

À essayer

Entrez un caractère ci-dessous pour obtenir son indice en Unicode.

UTF-8

Le code UTF-8 est un code qui permet de représenter les caractères définis en Unicode. Contrairement à ISO-8859-1 et à ASCII, UTF-8 est un code à longueur variable. Certains caractères sont représentés par un seul octet, d'autres par deux, trois ou quatre octets.

UTF-8 est un code qui est très largement utilisé sur le Web, La grande majorité des pages Web étant encodées en UTF-8 (comme celle que vous êtes entrain de lire). Aujourd'hui, UTF-8 est devenu le standard de facto pour représenter le texte sur le Web.

Pour les 128 premières positions d'Unicode, UTF-8 encode le caractère sur un seul octet. Pour ces premiers mots de code, le premier bit est toujours de zéro. Les 7 autres bits permettent d'encoder les 128 valeurs.

0 B1 B2 B3 B4 B5 B6 B7

Les bits B1 à B7 représentent les 7 bits de l'indice du caractère encodé en binaire.

! Remarque

Ces 128 premiers mots de code correspondent exactement au code ASCII. Cela signifie que tout texte ASCII (version sur 8 bits) est aussi un texte UTF-8 valide.

Pour encoder les caractères suivants jusqu'à l'indice 2047, UTF-8 utilise deux octets, selon le schéma suivant :

1 1 0 B1 B2 B3 B4 B5
1 0 B6 B7 B8 B9 B10 B11

Les bits B1 à B11 représentent les bits de l'indice du caractère, encodé en binaire sur 11 bits.

UTF-8 continue ainsi à utiliser des mots de code de plus en plus longs pour représenter les caractères suivants. Jusqu'à la position 65535, UTF-8 utilise trois octets, selon le schéma suivant :

1 1 1 0 B1 B2 B3 B4
1 0 B5 B6 B7 B8 B9 B10
1 0 B11 B12 B13 B14 B15 B16

Pour le reste des caractères, UTF-8 utilise quatre octets, ce qui est suffisant pour représenter tous les caractères Unicode restants au jour d'aujourd'hui.

Il est intéressant de constater que le code UTF-8 est un code préfixe. En effet, le code est conçu de manière à ce qu'aucun mot de code ne soit le préfixe d'un autre mot de code. Cette propriété permet de décoder un texte UTF-8 simplement en lisant les octets un par un depuis la gauche, sans jamais avoir besoin de regarder en arrière.

De plus, le code UTF-8 a la propriété que les octets qui démarrent un mot de code sont facilement différentiables des octets qui se trouvent au milieu ou à la fin d'un mot de code. En effet, ces derniers débutent toujours par la séquence de bits 10. Cette séquence de bits ne permet pas de démarrer un mot de code UTF-8. Cette propriété permet de facilement détecter les mots de code dans un texte encoder en UTF-8, et ce même si on ne commence pas à lire le texte depuis le début.

À essayer

Entrez un caractère dans le champ ci-dessous pour voir son indice dans Unicode et son encodage en UTF-8. Vous pouvez même entrez des caractères spéciaux comme des caractères accentués, des caractères d'alphabets non latins, des émoticônes, etc.

UTF-8 est un code aujourd'hui très répandu. Il a l'avantage de représenter les caractères ASCII avec un seul octet, ce qui permet de représenter beaucoup de textes avec un nombre d'octets raisonnable, en particulier les textes basés sur l'alphabet latin.

De plus, il permet de représenter tous les caractères Unicode au sein d'un même texte, ce qui est très pratique pour représenter des textes multilingues.

! Remarque

Il est intéressant de noter que UTF-8 n'est pas le seul code qui permet de représenter les caractères Unicode. Il existe aussi notamment le code UTF-16 et le code UTF-32.

UTF-16 est un code à longueur variable qui utilise entre 2 et 4 octets pour représenter les caractères Unicode. Quant à UTF-32, c'est un code à longueur fixe qui utilise toujours 4 octets, quel que soit le caractère à représenter.

Ces deux codes ont le désavantage de nécessiter plus d'octets que UTF-8 pour représenter les caractères ASCII, relativement fréquents dans les textes basés sur l'alphabet latin.

Dans cette section, nous avons vu comment représenter des caractères sous forme de séquences de bits à l'aide de différents codes. Équipé de cet outil, nous allons maintenant pouvoir nous intéresser à la notion de fichier.