[gull] Caractères accentués Linux-Windows
Marc Mongenet
Marc.Mongenet at freesurf.ch
Fri Jul 2 18:50:02 CEST 2004
Note: message en UTF-8, comme l'original.
Grégoire Métral wrote:
> Bonjour,
>
> Je me débats avec un problème d'accents dans les noms de fichiers lors
> d'échanges avec des systèmes Windows. J'utilise 2 systèmes qui
> réagissent différemment: une RedHat 8.0 (RH) -- serveur en prod. -- et
> une Mandrake 10.0 (MDK) -- système en test.
>
> Sur la MDK, un fichier créé depuis Linux me donnera des résultats
> conformes à mon attente:
> $ touch édition.txt
> Le fichier apparaît dans Windows et Linux comme "édition.txt".
>
> Toujours sur MDK, un fichier créé depuis Windows (partage samba) donnera
> un résultat conforme sur Windows, mais légèrement modifié sur Linux:
> $ ls
> édition.txt
> (si jamais les caractères passent mal, il s'agit d'un A majuscule avec
> tilda suivi du symbole "copyright")
Je ne connais pas la solution pratique, mais en théorie ça donne ceci :
Le mauvais passage observé ici est le résultat d'un programme qui
croit recevoir des caractères encodés en ISO-8859-1 (aussi appelé
ISO Latin 1) alors qu'il les reçoit en fait encodés en UTF-8.
ISO-8859-1 encode chaque caractère sur un octet. UTF-8 utilise un
nombre variable d'octets par caractère. On peut encore noter que
ISO-8859-1 est à la fois un répertoire de caractère et un encodage.
UTF-8 est uniquement un encodage parmi d'autres destiné à encoder le
répertoire Unicode. Le répertoire Unicode est un sur-ensemble du
répertoire ISO-8859-1 qui est lui-même un sur-ensemble du répertoire
ASCII.
Sans doute Windows envoie du UTF-8 à MDK, MDK le stocke et le renvoie
sans modification (donc aucun problème vu de Windows), mais l'affichage
sous MDK croit recevoir du ISO-8859-1 du disque alors que c'est du UTF-8,
d'où le 'é' affiché 'é'. En effet, UTF-8 encode 'é' sur deux octets.
ISO-8859-1
'é' sur un octet = 233 = 11101001
'Ã' sur un octet = 195 = 11000011
'©' sur un octet = 169 = 10101001
UTF-8
'é' sur deux octets = 195 169 = (110)00011 (10)101001
UTF-8 permet d'encoder 7 bits significatifs sur un octet 0vvvvvvv,
donc tous les caractères ASCII se retrouvent encodés comme d'habitude
et on ne remarque pas forcément un mauvais réglage. En revanche UTF-8
a besoin de deux octets pour encoder 8 bits significatifs et là on
observe un problème en cas de mauvais réglage.
UTF-8 permet d'encoder jusqu'à 11 bits sur 2 octets 110vvvvv 10vvvvvv,
c'est ce qui est fait ici.
Note : Pour tout savoir sur la conception (par Ken Thompson et
Rob Pike) et l'implémentation d'UTF-8, il y a une histoire à
<http://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt>.
> Sur la RH, le fichier créé depuis Linux me donnera comme résultat
> "├®dition.txt" (les symboles varient un peu selon l'affichage), et un
Les deux caractères '├®' sont encodés 226 148 156 194 174, soit
(1110)0010 (10)010100 (10)011100 (110)00010 (10)101110.
Comment 11101001 a pu se transformer en cela ?
Si on prend (110)00010 (10)101110, on remarque que les bits
significatifs sont 10101110, soit la même valeur que le second
octet d'encodage UTF-8. On aurait donc eu des caractères encodés
en UTF-8, puis pris pour des caractères ISO-8859-1 et réencodés
en UTF-8 (double-encodage en UTF-8) ? Mais je sèche sur le premier
caractère (1110)0010 (10)010100 (10)011100.
Marc Mongenet
More information about the gull
mailing list