Re: [SSFR] Histoires d'encodages (was: quel langage ?) |
[ Thread Index |
Date Index
| More debianworld.org/shellscript-fr Archives
]
Selon Vincent Lefevre <vincent@xxxxxxxxxx>:
> On 2005-12-02 10:57:41 +0000, Sébastien Aperghis-Tramoni wrote:
> > Les locales (comme LC_MESSAGES) reflètent la manière d'afficher les
> > messages et données, mais pas la manière d'entrer les données.
>
> Si, aussi la manière dont les données d'entrée doivent être interprétées
> (par souci de cohérence). Si j'écris "echo abcdé > fichier", alors le
> fichier contiendra une ligne "abcdé" encodée dans les locales courantes
> (encodage donné par LC_CTYPE).
Non, l'encodage des données est déterminé par le terminal.
> > $ echo $LANG $LANGUAGE $LC_ALL
> > fr_FR.UTF-8 fr_FR.UTF-8:fr fr_FR.UTF-8
> > $ perl -e 'print scalar reverse "abcdé"; print "\n"'
> > édcba
>
> Ça ne marche pas ici:
>
> $ locale
> LANG=fr_FR.UTF-8
> ...
> LC_ALL=fr_FR.UTF-8
> $ echo abcdé | od -Ax -txC -v
> 000000 61 62 63 64 c3 a9 0a
> 000007
Ton terminal est visiblement en UTF-8, le mien est en Latin1.
$ locale
LANG=fr_FR.UTF-8
...
LC_ALL=fr_FR.UTF-8
$ echo abcdé | od -Ax -txC -v
000000 61 62 63 64 e9 0a
000006
Tu vois ? Mon "é" est codé par "e9" alors que le tien est codé par "c3 a9".
> $ perl -e 'print scalar reverse "abcdé"; print "\n"' | od -Ax -txC -v
> 000000 a9 c3 64 63 62 61 0a
> 000007
>
> au lieu de c3 a9 64 63 62 61 0a.
>
> C'est avec perl v5.8.7 (Debian).
>
> Pour que ça fonctionne, il faut un "use utf8;" au début: dans ce cas,
> la chaîne litérale est reconnue comme étant en UTF-8.
>
> $ perl -e 'use utf8; print scalar reverse "abcdé"; print "\n"' | od -Ax -txC
> -v
> 000000 e9 64 63 62 61 0a
> 000006
>
> mais la sortie se fait en ISO-latin1. L'option -C permet d'avoir une
> sortie en UTF-8 (mais cette option -C n'a aucun effet sur la chaîne
> litérale, si bien que le "use utf8;" est toujours nécessaire).
En fait, j'ai
$ perl -e 'print scalar reverse "abcdé"; print "\n"' | od -Ax -txC -v
000000 c3 a9 64 63 62 61 0a
000007
sur un Perl 5.8.0 RedHat. Toujours avec un terminal Latin1.
La documentation indique justement que Perl 5.8.0 détectait les locales
en cours pour savoir quel encoding sélectionner. D'autres programmes
peuvent faire pareil, mais c'est une heuristique, pas une données sûre.
Les locales concernent l'affichage, alors que les données en entrées
sont fournies par le terminal.
--
Sébastien Aperghis-Tramoni
Close the world, txEn eht nepO.