Artisan Numérique

/système/vidéo/mandriva/système de fichier/utf8/ Fixer les problèmes d'encodage

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.

Régler l'encodage du système

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 :

LC_TELEPHONE=fr_FR.UTF-8
LC_CTYPE=fr_FR.UTF-8
LANGUAGE=fr_FR.UTF-8:fr
LC_MONETARY=fr_FR.UTF-8
LC_ADDRESS=fr_FR.UTF-8
LC_COLLATE=fr_FR.UTF-8
LC_PAPER=fr_FR.UTF-8
LC_NAME=fr_FR.UTF-8
LC_NUMERIC=fr_FR.UTF-8
SYSFONT=lat0-16
LC_MEASUREMENT=fr_FR.UTF-8
LC_TIME=fr_FR.UTF-8
LANG=fr_FR.UTF-8
LC_IDENTIFICATION=fr_FR.UTF-8
LC_MESSAGES=fr_FR.UTF-8

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.

Sous un Windows XP récent, les systèmes de fichiers sont je crois maintenant encodés en UTF-8, de même que les partages. En revanche, il y a un hic avec Java qui persiste pour des raisons historiques à rester en ISO. Du coup, un environnement de développement comme Eclipse est spontanément ISO ce qui est loin d'être une idée de génie. Pour changer cela, il faut aller dans le paramétrage d'Eclipse, section Workspace, et changer l'encodage global de l'espace de travail. Cela ne va cependant pas modifier les fichiers déjà écrits en ISO mais juste assurer que l'encodage des prochains seront en UTF.

Les noms de fichiers

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 :

cd mon_dossier_a_convertir
convmv --notest -r -f iso-8859-15 -t utf-8 *

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.

Conversion des contenus

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 --from-code=ISO-8859-1 --to-code=UTF-8 ancien_fichier.java -o ./nouveau_fichier.java

iconv est globalement moins sympa que convmv :

  • Pas de mode récursif.
  • Impossible d'écrire le fichier sur lui-même que ce soit par une redirection ou un -o, la sanction serait un fichier vide ;-)
  • Aucune vérification sur le fait que le fichier source soit effectivement codé en ISO.

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.

#! /bin/sh

logger $PWD $1
iconv  --from-code=ISO-8859-1 --to-code=UTF-8 "$1" >  ~/tmp/iconv
mv ~/tmp/iconv "$1"
/.gnome2/nautilus-scripts/ISO to UTF

Maintenant si vous tenez à convertir un lot de fichier, cela peut être fait ainsi :

for fichier in $(find -type f . -name "*.java") do iconv --from-code=ISO-8859-1 --to-code=UTF-8 $fichier -c >> ~/tmp/iconv rm $fichier mv ~/tmp/iconv $fichier done

Conclusion

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.