[Toulibre] Courrier électronique: quel encodage utiliser ?

Sébastien Dinot sdinot at april.org
Jeu 16 Nov 22:33:42 CET 2006


Bonsoir,

lafrech a écrit :
| Y a-t-il un encodage qui fasse consensus et que je puisse utiliser
| et recommander aux gens avec qui je communique ? (J'ai l'impression
| que non...)

Pour compléter les réponses précédentes, non, il n'y a pas d'encodage
universel au sens où le problème se situe à quatre niveaux :

1. Les jeux de caractères n'ont pas tous la même taille et n'encodent
   pas tous le même ensemble de symboles. On ne peut donc généralement
   pas obtenir de relation bijective entre deux jeux (i.e. pouvoir
   faire correspondre à chaque caractère d'un jeu un caractère de
   l'autre jeu). A titre d'exemple :

   Pour la taille :

   - Le jeu US-ASCII à une capacité de 128 caractères.

   - Les jeux ISO-8859-xx, CP437, CP850, CP1252 ont une capacité de
     256 caractères.

   - L'UTF-16 de 65 536.

   - L'UTF-8, UCS4 de 4 294 967 296 (mais à ce jour, seuls environ
     70 000 sont définis).

   Pour l'ensemble de caractères :

   - L'ISO-8859-15 définit un code pour le symbole Euro et la ligature
     entre le o et le e mais pas l'ISO-8859-1.

   - Le jeu CP1252 définit un code pour les trois points de suspension
     (qui apparaissent donc sous la forme d'un seul caractère) mais
     pas le jeu ISO-8859-15.

2. Une fois que l'ensemble de symboles représentés par un jeu de
   caractères est défini, plusieurs stratégies peuvent être utilisées
   pour encoder ce jeu et donc stocker les chaînes, les manipuler ou
   les transférer.

   On peut annoncer chaque caractère par :

   - un nombre constant d'octets : 1 pour l'ISO-8859-15), 2 pour
     l'UTF-16, 4 pour l'UCS-4.

   - un nombre variable d'octets : de 1 à 6 pour l'UTF-8.

     => En fait, l'UCS-4 et l'UTF-8 sont deux encodages différents
        d'un même jeu de caractères nommé « Unicode ». UCS-4 vise la
        simplicité, UTF-8 la minimisation de l'empreinte mémoire.

   - un changement de base (chaque digit étant alors codé sur un octet
     différent) généralement accompagné d'un décalage constant ou
     variable pour amener les valeurs résultantes dans la plage de
     caractères US-ASCII considérée comme « robuste ». C'est le cas du
     Quoted-Printable (=20 pour l'espace de code ASCII 32), des
     entités XML ( pour l'espace), de l'encodage en base 64.

   - une séquence symbolique (entités HTML telles que  ).

   Anecdote : pour corser le tout, certains jeux de caractères peuvent
   ou non s'annoncer par une séquence spéciale (c'est notamment le cas
   de l'UTF-8 dans les fichiers).

3. Bien évidemment, les choses seraient trop simples si les systèmes
   d'exploitation et les outils qu'ils font tourner étaient
   « polyglottes ». Chacun ayant son « dialecte » natif et causant
   plus ou moins bien quelques « langues étrangères », selon la cible
   finale, on peut être amené à conseiller des jeux de caractères
   différents.

4. Cerise sur le gâteau, reste le problème de l'encodage des fins de
   ligne (CR sur Mac, LF sur Unix, CR-LF (ou LF) sous MS-Windows).

Et je ne parle même pas des fichiers successivement édités sur Mac,
MS-Windows et GNU/Linux avec des outils plus ou moins sérieux (j'ai
connu, c'est atroce et les outils de réencodage les plus puissants s'y
cassent les dents : il ne vous reste alors que votre bon vieux cerveau
et vos mimines pour réparer les dégâts).

Au passage, si vous avez besoin de réencoder des textes, je vous
conseille vivement recode. A mes yeux, c'est le nec plus ultra en la
matière. Par exemple :

Texte Unix (ISO-8859-15/LF) vers MS-Windows (CP1252/CR-LF) :

  echo -e "<p>Sébastien &\nses sœurs</p>" | recode l9/..cp1252/cl

Même texte vers HTML 4 avec préservation des caractères diacritiques
(supprimez « --diacritic » pour voir) :

  echo -e "<p>Sébastien &\nses sœurs</p>" | recode --diacritic l9/..h4/

Idem vers XML (testez la commande pour observer les différences avec
la ligne précédente) :

  echo -e "<p>Sébastien &\nses sœurs</p>" | recode --diacritic l9/..h0/

Idem en Quoted-Printable :

  echo -e "<p>Sébastien &\nses sœurs</p>" | recode l9/../QP


A++, Sébastien

-- 
Sébastien Dinot, sdinot at april.org
Secrétaire de l'APRIL (http://www.april.org)
Association pour la Promotion et la Recherche en Informatique Libre



Plus d'informations sur la liste de diffusion Toulouse-ll