IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

Pierre Fauconnier

VBA: Unicode, utf-8: un peu d'histoire

Noter ce billet
par , 02/10/2021 à 08h00 (2209 Affichages)
Salut

Unicode, utf-8, Ascii, LATIN-1, ISO-1859-1... quel bazar. Un peu d'histoire pour commencer à comprendre?

ASCII

Au commencement, il n'y avait rien... Enfin, je veux dire, pas de norme. Chaque ordinateur (rien à voir avec le truc avec lequel vous lisez ces lignes) utilisait sa propre "logique" pour coder les caractères, et "on" vit très vite que cela n'était pas bon.

Pour organiser ce foutoir, les américains, chez qui les bestioles informatiques commençaient à voir le jour, décidèrent d'une norme pour coder les caractères, et organisèrent une "page de code" sur 7 bits (128 caractères de 0-NULL à 127-DELETE), le huitième étant parfois utilisé pour une vérification de parité. Cette norme est la norme ASCII (American Standard Code for Information Interchange) et reprend les 52 lettres de l'alphabet (majuscules et minuscules), les chiffres, la ponctuation, des caractères de contrôle (le "retour chariot CR", le "saut à la ligne LF", Le "Delete", le "Null, ...).

Mais il n'est pas simple d'exporter le système et d'imposer l'ordinateur partout dans le monde avec ce ridicule petit jeu de caractères. En effets, il manque les caractères diacritiques (accents, cédille, œ, ...). Le 8ième bit est alors utilisé dans ce qu'on appelle l'ASCII étendu qui comprend alors 256 caractères.


Pages de code

Mais 256 caractères, c'est peu pour l'ensemble des caractères de la planète, et chaque pays ou zone de langue adapte cette première page de code à ses besoins propres. C'est ainsi qu'on voit apparaître ISO-1859-1 pour les langues latines, vite suivie par ISO-1859-2. Les pays asiatiques ne sont pas en reste et il y a donc, in fine, une multitude de pages de code.

C'est chouette tant que les systèmes échangent avec des systèmes utilisant la même page de code, ça l'est beaucoup moins lorsqu'un système ISO-1859-1 doit échanger avec un système qui utilise une page de code différente. Certains caractères sont alors mal décodés, et le chaos n'est pas loin. Il faut que chaque système connaisse les pages de codes des autres systèmes avec lesquels il communique, et ça devient vite galère.


Unicode, l'esperanto des pages de codes

Lorsque les humains ont dû communiquer entre eux, ils ont été confrontés au même problème. Si je souhaite parler à un anglais, soit je parle anglais soit il comprend le français. Si je souhaite parler à un italien, soit je parle italien, soit il comprend le français. Pas pratique pour s'adresser à un auditoire multilingue. Et si on inventait une langue commune? Il suffirait alors de connaître sa langue maternelle et cette langue commune. Si chaque personne sur terre connaissait sa langue et la langue universelle, ce serait alors simple de communiquer. Entre nous, on parle notre langue, et quand on s'adresse à des personnes qui ne la connaissent pas, on leur parle en langage universel, puisqu'elles le comprennent aussi. L'esperanto était né, même si on doit reconnaître aujourd'hui que l'objectif est plutôt raté.

Pour le dialogue entre systèmes informatiques, on a utilisé la même démarche, en sachant qu'on ne pouvait pas rater l'objectif. Il était crucial que tous les systèmes se comprennent entre eux. On a alors imaginé LA page de code universelle, celle qui contiendrait tous les "caractères" utilisés dans toutes les langues de la planète, l'esperanto des pages de codes. UNICODE était né.

Tout ordinateur utilisant la page de code Unicode peut échanger avec tout ordinateur qui l'utilise aussi. Plus besoin de savoir "en quoi on parle" et de devoir connaître plein de pages de codes différentes. Connaître la sienne (ISO-1859-1 pour nous) et Unicode et hop, on est compris par tous les autres systèmes qui adoptent aussi Unicode.

Unicode reprend les 128 caractères de ASCII et +/- les 256 de ISO-1859-1. Cela signifie que, en gros, nous pourrions communiquer avec le reste du monde en gardant notre page ISO-1859-1.


Un problème de taille

C'est chouette, mais il subsiste un problème, et de taille... Je veux dire, de taille de l'information que l'on échange. On a vu que notre page ISO-1859-1 contenait 256 caractères et tenait donc sur 1 octet, mais la page Unicode en contient bien plus. Et si on la faisait tenir sur 2 octets? On disposerait alors de 65 536 caractères... Yeah, fastoche, tous les caractères du monde entier vont tenir dedans...

Désolé de vous décevoir, mais non, tous les caractères ne tiendront pas sur deux octets... Il y en a trop. Il va falloir utiliser un troisième octet. Avec cela, on pourrait en théorie disposer de 16 777 216 caractères (en fait moins, on verra cela quand on parlera de utf-8). Là, on a de la marge. Aujourd'hui, on utilise +/- 15% de la capacité de la page de code Unicode.

Mais coder sur 3 octets, ça reste un très gros problème, car cela veut dire que le poids (le nombre d'octets) de toute chaine transmise triple en passant en Unicode. En effet, la lettre A (65dec en ASCII, soit 01000001bin) devient en Unicode 00000000 00000000 01000001. La chaine triple de volume pour transporter beaucoup d'octets dont tous les bits sont à 0, alors que les systèmes utilisant Unicode connaissent cette lettre par son code 65dec, soit 01000001bin. En fait, tout caractère dont le code est inférieur à 128 devrait pouvoir être envoyé sur 1 octet, puisque UNICODE reprend tels quels les codes ASCII (rappel, ASCII = 128 caractères, ASCII étendu = 256 caractères).


Coder l'unicode

On fera ici la différence entre Unicode (page de code universelle) et le codage de cette page de code, c'est-à-dire la façon d'écrire en unicode. Il en existe là aussi plusieurs, mais la plus utilisée est UTF-8.

UTF-8 permet de transmettre les caractères dont le code est <128 en un seul caractère, et code les caractères dont le code est >127 d'une manière à économiser les octets.

Si vous disposez de NOTEPAD ++, vous pouvez y saisir le texte suivant: Bonjour, un café svp. Ça fera 2€, monsieur. Le texte sera compris comme étant "codé" en utf-8. Si vous basculez le codage en ANSI, vous verrez ceci: Bonjour, un café svp. Ça fera 2€, monsieur

On voit que le é est codé sur deux octets avec les caractères é, le Ç est aussi sur deux octets avec Ç. Le sigle de l'euro € est lui codé sur 3 octets avec les caractères €.


Comment convertir de et vers utf8?

Nous verrons comment dans un prochain billet, où j'aborderai aussi une fonction VBA personnalisée qui convertit une chaine textuelle en UTF-8, ainsi qu'une fonction qui fait l'inverse, à savoir recevoir de l'UTF8 et le convertir et la lire correctement.

Envoyer le billet « VBA: Unicode, utf-8: un peu d'histoire » dans le blog Viadeo Envoyer le billet « VBA: Unicode, utf-8: un peu d'histoire » dans le blog Twitter Envoyer le billet « VBA: Unicode, utf-8: un peu d'histoire » dans le blog Google Envoyer le billet « VBA: Unicode, utf-8: un peu d'histoire » dans le blog Facebook Envoyer le billet « VBA: Unicode, utf-8: un peu d'histoire » dans le blog Digg Envoyer le billet « VBA: Unicode, utf-8: un peu d'histoire » dans le blog Delicious Envoyer le billet « VBA: Unicode, utf-8: un peu d'histoire » dans le blog MySpace Envoyer le billet « VBA: Unicode, utf-8: un peu d'histoire » dans le blog Yahoo

Mis à jour 03/10/2021 à 11h15 par Pierre Fauconnier

Catégories
VBA , MS Office

Commentaires