Aujourd'hui la majorité des grandes distributions est passée à l'encodage UTF-8, permettant l'affichage propre d'un large panel de symboles linguistiques. Maintenant lorsqu'il s'agit de vieux systèmes mis à jour, ou quant l'on en vient à utiliser des fichiers provenant notamment du monde Windows, il peut être utile de savoir comment unifier les encodages de sorte à garder un système de fichier propre.
La première chose à vérifier est que le système est bien en UTF. Certains système que l'on a mis à jour à la main, sans passer par un ré-installation complète restent encore en ISO-8859-15. C'était mon cas pour une vielle configuration que j'avais fait progresser de Mandriva 7.2 jusqu'à aujourd'hui (on ne rigole pas
.
Sous Mandriva, il faut vérifier le fichier /etc/sysconfig/i18n qui doit contenir quelque chose comme cela :
Après cela, on fait comme pour Windows, on reboot
et le système passe tout seul en UTF-8. Une chose de faite...
SI même après cela vous êtes toujours en ISO en tant qu'utilisateur (pour savoir cela, lancez la commande locale dans une console non-root, vous devriez voir des fr_FR.UTF-8 apparaître), c'est sûrement que vous avez une configuration locale à votre compte. Regardez si vous n'auriez pas un fichier ~/.i18n et si c'est le cas, supprimez-le, déconnectez-vous et reconnectez-vous.
Une fois que le système est clairement en UTF-8, le point suivant sont les noms de fichiers. Soit, comme pour le point précédent, il s'agit d'un "vieux" système de fichier, soit plus régulièrement, c'est un Windowsien qui vous envoie une archive type Zip qui contient des encodages ISO et qui se décompresse tel-quel sur votre système de fichiers UTF-8.
Dans un cas, comme dans l'autre, il nous faut donc convertir chaque noms de fichier (pas leur contenu) en les renommant ce qui serait un peu fastidieux. Heureusement, une bonne âme a construit un outil qui remplis parfaitement cette tâche, convmv. Soit vous pouvez directement installer le paquet (ex. sous Mandriva, par un urpmi convmv), soit par les sources. Ensuite, la syntaxe est la suivante :
Les options -f et -t représentent respectivement l'encodage source (iso-8859-15) et cible (utf-8). L'option notest indique à l'outil que ce n'est pas une simulation (enlever cette option si vous voulez vérifier que tout se passe bien). L'option -r demande à traiter le dossier ainsi que tous les sous-dossier (récursif), à enlever donc si vous ne souhaiter traiter que le dossier courant. Enfin * indique qu'il fait traiter tout les fichiers, et il peut être remplacé par le nom d'un fichier unique à convertir.
Une fois l'opération terminé, vos noms fichiers doivent être lisibles.
Là, nous sortons un peu du cadre de l'OS car les contenus textes sont très logiquement géré par les applications idoines. Pour convertir un contenu ISO en UTF, la commande magique est iconv utilisable comme ceci :
iconv est globalement moins sympa que convmv :

Au fond, le vrai point problématique est le dernier, mais là, iConv n'y est pour rien. En effet, il n'y a aucun moyen fiable de savoir avec quel format est encodé un fichier texte. Il existe tout au plus des algorithmes permettant de le "deviner" mais plus le texte est cours, moins l'algorithme fonctionnera.
En somme, si vous avez un fichier ISO parmi une série d'UTF à convertir, utilisez la syntaxe précédente, quitte à gommer les deux premiers points par un petit script que vous pouvez par exemple coller dans les scripts Nautilus pour les avoir sur un click-droit :
Maintenant si vous tenez à convertir un lot de fichier, cela peut être fait ainsi :
Avec ces deux trois astuces, vous devriez couvrir l'ensemble des cas de figures permettant d'importer chez vous des fichiers non-ISO ou de convertir en UTF des fichiers qui devrait l'être.
Si l'impact UTF/ISO est assez faible pour un utilisateur standard, il est beaucoup plus critique s'agissant par exemple d'un développeur. Dans ce cas, l'UTF devient un encodage commun à tous, quel que soit le pays ou la plateforme utilisée. Et c'est encore plus vrai dans le monde open source.
- répondre
tuxce , le 5 September, 2008 - 12:21pour ce qui est du redémarrage, il est meilleur pour avoir la totalité du système en utf8, mais se reconnecter ou relancer un service suffit à passer l'utilisateur ou le service en utf8, /etc/sysconfig/i18n étant lu par le fichier /etc/profile.
- répondre
Dab, le 5 September, 2008 - 13:15Et pour la route une petite fonction Perl d'encode en utf8:
- répondre
Ulhume, le 5 September, 2008 - 13:46@tuxce s'était un peu l'idée, je veux dire d'avoir l'ensemble du système fonctionnel. Ceci dit, sous Mandriva, il ne semble pas que ce soit /etc/profile qui gère cet aspect des choses. Quant à pouvoir dire qui le fait...
- répondre
Ulhume, le 5 September, 2008 - 13:46@Dab attention, je vais te mettre la même en java sinon
- répondre
Dab, le 5 September, 2008 - 14:10Chiche
- répondre
tuxce , le 5 September, 2008 - 15:46ben si normalement, c'est /etc/profile.d/*lang.csh (me rappelle plus du numéro)
mais c'était juste pour indiquer que le redémarrage n'est pas nécessaire
- répondre
Ulhume, le 5 September, 2008 - 15:51Je me fais chercher là, bon, ok :
Vala
en fait le truc en java c'est que les chaînes sont codées, en interne, en java. Donc de manière plus générale, si j'ai par exemple une volée de bytes codant une chaîne ISO, j'obtiens la chaîne UTF par un
- répondre
Dab, le 5 September, 2008 - 16:28Oh ben fallait pas
Par contre ça t'oblige à connaitre le codage de la chaine.
Ex de la fonction Perl
j'ai deux fichiers avec des codages différents:
$file -i *
iso8859-1.txt: ISO-8859 text
utf8.txt: UTF-8 Unicode text
#!/usr/bin/perl
use File::Slurp qw( read_file );
use Encode;
use utf8;
my $encoding = "utf-8";
my $iso8859 = scalar read_file( "iso8859-1.txt" );
$iso8859 = encutf8($iso8859);
print $iso8859;
my $utf8 = scalar read_file( "utf8.txt" );
$utf8 = encutf8($utf8);
print $utf8;
- répondre
Ulhume, le 5 September, 2008 - 16:36@Dab
certes ça t'obliges à connaître l'encodage de la chaîne mais d'un autre côté, j'ai souvent planté perl qui se trompait d'encodage en cherchant à le deviner (typiquement avec un ou deux accentués sur un paragraphe).
- répondre
Dab, le 5 September, 2008 - 16:52Je dois te dire que j'ai uniquement testé en iso8859 et utf8, les seuls que j'utilise, dans ces cas ça traduit correctement. C'est cette méthode que j'utilise pour la traduction des fichiers en texte sur Catapulse.
- répondre
Ulhume, le 5 September, 2008 - 16:56@dab non mais ça marche très bien aussi sur les autres encodages, le seul truc c'est que lorsque tu utilises cela sur une phrase courte, ne contenant qu'un ou deux accents, il n'est pas sur de lui. Ce qui est normal je pense car rien de purement rationnel lui permet de déterminer l'encodage, c'est une pure heuristique.
- répondre
Dab, le 5 September, 2008 - 17:37Franchement je ne sais pas du tout sa manière d'y parvenir, ni beaucoup plus sur l'encodage:) mais je viens de tester avec une courte phrase et même avec un unique caractère et ... ça fonctionne encore. Maudit Perl, veut pas se tromper
- répondre
Ulhume, le 5 September, 2008 - 18:26@Dab bein moi je veux bien le voir me deviner l'encodage entre deux ISO différents
PS: c'est pas un challenge que je lance, y'a sûrement plus intéressant à faire de son temps
- répondre
Dab, le 5 September, 2008 - 21:17hmmm , si tu avais un fichier en esperanto (ISO-8859-3) sous la main, je veux bien tester
- répondre
fredg , le 6 September, 2008 - 11:35Excellent, très instructif, merci.
++
- répondre
Ulhume, le 6 September, 2008 - 22:34@Dab J'ai pas cela en stock, mais tu dois pouvoir faire cela facilement en sauvant un texte avec gedit ou autre.
- répondre
Ulhume, le 6 September, 2008 - 22:34@fredg de rien
Poster un nouveau commentaire