4. Représentation d'un texte pour un ordinateur

Un ordinateur ne manipule en fin de compte que des bits (0 ou 1). Or, nous écrivons avec des lettres et des signes de ponctuations. Comment faire la correspondance entre la suite de 0 et de 1 manipulée par l'ordinateur et le texte tel qu'il a été écrit ?

Charset et Encoding

En télécommunications et en informatique, un jeu de caractères codés (charset encoding en anglais) est un code qui associe un jeu de caractères d’un alphabet avec une représentation numérique pour chaque caractère de ce jeu. Le jeu de caractère est nommé charset (character set) et le code qui relie chaque caractère à un nombre est nommé encoding.

Par exemple, le code Morse (qui associe l’alphabet latin à une série de pressions longues et de pressions courtes sur le manipulateur morse du télégraphe) est un des premier jeux de caractères codés.

Le code ASCII (on prononce [askiː]) s’est imposé au début de l’ère informatique pour coder 128 lettres, chiffres et autres symboles.

Le code ASCII

Le code ASCII (American Standard Code for Information Interchange) permet de coder les caractères les plus utilisés en langue anglaise : les lettres de l’alphabet en majuscule (de A à Z) et en minuscule (de a à z), les dix chiffres arabes (de 0 à 9), des signes de ponctuation (point, virgule, point-virgule, deux points, points d’exclamation et d’interrogation, apostrophe ou quote, guillemet, parenthèses, crochets etc.), quelques symboles et certains caractères spéciaux invisibles (espace, retour-chariot, tabulation, retour-arrière, etc.).

Les créateurs de ce code limitèrent le nombre de ses caractères à 128, c’est-à-dire 27 , pour qu’ils puissent être codés avec seulement 7 bits : les ordinateurs utilisaient des cases mémoires de un octet, mais ils réservaient toujours le 8ème bit pour le contrôle de parité (c’est une sécurité pour éviter les erreurs, qui étaient très fréquentes dans les premières mémoires électroniques).

On peut présenter la table des caractères ASCII sous une forme qui met en évidence une organisation fondée sur la base 16.

Dans ce fichier sont énumérés les 128 caractères ASCCI dont les 33 caractères de contrôle (codes 0 à 31 et 127) sont présentés avec leur nom en anglais suivi d'une traduction entre parenthèses. On trouvera quelques détails en plus sur ces caractères de contrôle ici.

Exercice 1 (exercice_B41.pdf)
  1. Avec un encodage ASCII, sur combien de bits est encodé un caractère ?
  2. Vérifier que le code ASCII de l'espace (noté SP) est 0010 0000.
    Quel est le code ASCCI de la lettre a ? de la lettre A ?
  3. A l'aide de la table ASCII, coder en binaire la phrase : L'an qui vient !
  4. Que signifie cette phrase codée en binaire : 01000010 01110010 01100001 01110110 01101111 00100001.
  5. Quelle est la taille (en octets) de la phrase : Enfin ! Je viens de comprendre ce qui s’est produit. (attention, il faut compter les espaces, et signes de ponctuation…) ?
  6. Vérifier en tapant cette phrase avec un éditeur de texte quelconque. Il suffit d’écrire le texte, puis de l’enregistrer en tant que « texte brut » (le plus souvent avec une extension .txt) et ensuite de vérifier la taille en octets du fichier obtenu (ce qui peut se faire en cliquant d’abord avec le bouton droit sur l’icône du fichier puis sur « Propriétés »).
  7. Écrire la même chose dans un logiciel de traitement de texte (comme LibreOffice Writer). Expliquer pourquoi la taille du fichier n’est pas la même. Pour se rendre compte plus précisemment, clic-droit sur le fichier et ouvrir avec une autre application, sélectionner Gestionnaire d'archive. Que contient donc le fichier ? Vous pouvez aussi dans un terminal lancer la commande unzip fichier.odt -d unzip et aller voir dans le répertoire unzip créé ce qu'il contient.
  8. Quelle est la taille (en octets) de la phrase : Enfin ! Je viens de comprendre ce qui s’est passé.? Sur combien de bits est codé le caractère é ?
  9. Pourquoi, historiquement, ne trouve-t-on pas de lettre accentuée dans la table ASCII ?

Quand la table ASCII ne suffit pas !

Pour coder un texte dans un alphabet plus complexe et pour échanger des informations sur l’Internet, il faut impérativement disposer d’un charset plus complet.

Par exemple, en français les caractères é, è, ç, à, ù, ô, æ, œ, sont fréquemment utilisés alors qu’ils ne figurent pas dans la table ASCII.

Il va donc falloir étendre la table ASCII pour pouvoir coder les nouveaux caractères. Les mémoires devenant plus fiables et, de nouvelles méthodes plus sûres que le contrôle de parité ayant été inventées, le 8ième bit a pu être utilisé pour coder plus de caractères.

On élimine ainsi l’inconvénient très gênant de ne coder que les lettres non accentuées, ce qui peut suffire en anglais, mais pas dans les autres langues (comme le français et l’espagnol par exemple). On a pu aussi rajouter des caractères typographiques utiles comme des tirets de diverses tailles et sortes.

Le fait d’utiliser un bit supplémentaire a bien entendu ouvert des possibilités mais malheureusement tous les caractères ne pouvaient être pris en charge. La norme ISO 8859–1 appelée aussi Latin-1 ou Europe occidentale est la première partie d’une norme plus complète appelée ISO 8859 (qui comprend 16 parties) et qui permet de coder tous les caractères des langues européennes. Cette norme ISO 8859–1 permet de coder 191 caractères de l’alphabet latin qui avaient à l’époque été jugés essentiels dans l’écriture, mais omet quelques caractères fort utiles (ainsi, la ligature œ n’y figure pas). Dans les pays occidentaux, cette norme est utilisée par de nombreux systèmes d’exploitation, dont Linux et Windows. Elle a donné lieu à quelques extensions et adaptations, dont Windows-1252 (appelée ANSI) et ISO 8859-15 (qui prend en compte le symbole € créé après la norme ISO 8859-1). C’est source de grande confusion pour les développeurs de programmes informatiques car un même caractère peut être codé différemment suivant la norme utilisée.

Exercice 2 (exercice_B42.pdf)
  1. Combien de caractères ont été codés avec la table ASCII ? Sur combien de bits ?
  2. Combien de bits utilisent les 3 tables d'encodage ci-dessus ?
    Combien de caractères peut-on encoder au maximum ?
  3. Voici le code binaire d'un texte : 01000010 01110010 01100001 01110110 01101111 00101100 00100000 01110100 01110101 00100000 01100001 01110011 00100000 01110000 01110010 01100101 01110011 01110001 01110101 01100101 00100000 01110100 01101111 01110101 01110100 00100000 01110100 01110010 01101111 01110101 01110110 11101001 00101110 00101110 00101110

    Convertir ce texte qui est écrit dans l'un des 3 encodages fournis ci-dessus.
  4. A quelles conditions peut-on distinguer entre l'encodage CP1252 et l'ISO 8859-15 ?
  5. Est-ce que la table ASCII est totalement compatible avec l'ISO8859-15 ? avec l'encodage CP1252 ?
  6. Les tables d'encodage ISO8859-15 et CP1252 sont-elles compatibles ?
  7. Que se passe-t-il quand on ne précise pas quelle table d'encodage a été utilisée ? Le logiciel va essayer de déterminer l'encodage à partir d'un certain nombre de tests. Mais cela ne marche pas toujours quand les encodages sont peu différents. Ouvrez ce lien sous firefox. Modifier l'encodage utilisé pour décoder le texte. Qu'observez-vous ?

La norme Unicode et UTF-8

La globalisation des échanges culturels et économiques a mis l’accent sur le fait que les langues européennes coexistent avec de nombreuses autres langues aux alphabets spécifiques voire sans alphabet. La généralisation de l’utilisation d’Internet dans le monde a ainsi nécessité une prise en compte d’un nombre beaucoup plus important de caractères (à titre d’exemple, le mandarin possède plus de 5000 caractères !). Une autre motivation pour cette évolution résidait dans les possibles confusions dues au trop faible nombre de caractères pris en compte ; ainsi, les symboles monétaires des différents pays n’étaient pas tous représentés dans le système ISO 8859-1, de sorte que les ordres de paiement internationaux transmis par courrier électronique risquaient d’être mal compris.

La norme Unicode a donc été créée pour permettre le codage de textes écrits quel que soit le système d’écriture utilisé.

On attribue à chaque caractère un nom, une position normative et un bref descriptif qui seront les mêmes quelle que soit la plate-forme informatique ou le logiciel utilisés. Un consortium composé d’informaticiens, de chercheurs, de linguistes et de personnalités représentant les États ainsi que les entreprises s’occupe donc d’unifier toutes les pratiques en un seul et même système : l’Unicode.

L’Unicode est une table de correspondance Caractère-Code (Charset), et l’UTF-8 est l’encodage correspondant (Encoding) le plus répandu. Il existe d'autres encodings comme UTF-16 ou UTF-32.

Maintenant, par défaut, les navigateurs Internet utilisent le codage UTF-8 et les concepteurs de sites pensent de plus en plus à créer leurs pages web en prenant en compte cette même norme ; c’est pourquoi il y a de moins en moins de problèmes de compatibilité.

Chaque caractère dans Unicode est identifié par un code point unique.

Exercice 3 (exercice_B43.pdf)
  1. Ouvrez ce lien sous firefox. Afficher le code source de la page.
    Où est indiqué le jeu de caractère (charset) utilisé ?
  2. Ouvrir sous linux un terminal et taper la commande locale. Qu'affiche-t-elle ?
  3. Sous linux, lancer le logiciel gucharmap soit à partir du menu, soit à partir d'un terminal. Ce logiciel permet de voir tous les caractères codés en UTF-8 par langue.
    Est-il possible d'utiliser un alphabet latin ? D'écrire en vieux perse ? en runes ?
  4. Dans UTF-8, est-ce seulement des langues vivantes qui ont été encodées ?
  5. Ouvrir dans pyzo ce fichier. Ecrire une fonction repr_bin(s) qui prend comme argument une chaîne de caractère s et qui renvoie la représentation binaire de la chaîne de caractère dans cet encodage. On s'aidera des 2 fonctions de test données.
  6. Dans ce même fichier, écrire une fonction decode_binaire(sb) qui prend en argument une suite de bits et qui renvoie la chaîne de caractère s initialement encodée par la fonction repr_bin(s).
  7. Ce fichier contient une phrase en binaire codée en UTF8.
    A vous de la décoder avec votre fonction decode_binaire.
    Venez ensuite voir le professeur : il y a un point important à comprendre car si on a commencé à parler sur UTF8, on n'a pas définit les choses !
  8. Trouver la valeur décimale correspondant au symbole euro . Convertir cette valeur en hexadécimal. En vous aidant du texte en dessus de l'exercice, déterminer le code point du caractère en UTF8. Vérifier avec le logiciel gucharmap en regardant dans la rubrique Commun ou en utilisant la recherche.
  9. L’encodage UTF-8 utilise 1, 2, 3 ou 4 octets pour coder en binaire les caractères. Combien de valeurs peut-on coder sur 4 octets ? Cette question est une question de base en informatique. Vous devez tous savoir la traiter.

Comme vous avez pu le voir, Unicode inclue tous les langages humains actuels et passés (y compris la dizaine de milliers de caractères chinois), les symboles mathématiques et les emoji.

Il faut maintenant des réflexes quand on programme !

Ce qu'on a vu doit avoir des répercussions sur notre manière de programmer.

Liser cette page qui explique 5 règles auxquelles faire très attention !
Il vous faudra dorénavant les mettre en application systématiquement (Les 3 premières sont obligatoires).

Exercice 4 (exercice_B44.pdf)
Faire une carte mentale des 5 règles vues dans cet extrait de page web. Venir la montrer au professeur. Cet exercice ne doit pas prendre plus de 10 min.