Modifier l'encodage des fichiers textes
Auteur : kankan
Écrit le 10/08/2009.
Dernière mise à jour : 28/12/2009.
Vu 1221 fois.
Licence CC-BY-SA 2.0.
Dès qu'on travaille avec du texte dans des langues latines, comme le français, l'espagnol et l'italien, on doit mettre des accents sur certaines lettres, voir utiliser des lettres spéciales, avec des entrelas.
Malheureusement, le "codage de base" pour écrire des caractères en informatique, l'ASCII, s'est développé outre-atlantique, en anglais. Le "A" de ASCII veut d'ailleurs dire "American". De base, il ne gère pas les accents, ni certains de nos caractères spécifiques. Et je ne vous parle même pas des écritures arabes ou des idéogrammes chinois...
Pour remédier à cela, on a créé tout un tas d'encodages, qui reprennent l'alphabet l'ASCII, en y ajoutant des caractères, spécifique pour tel ou tel type de langue.
Toutefois, ces encodages complémentaires ne sont pas compatibles entre eux. Qui n'a jamais vu apparaitre des suites de caractères telles que é à la place des accents dans un fichier texte ?
Le fonctionnement du codage des caractères
Cette partie est purement théorique. Elle est néanmoins intéressante, notamment pour les développeurs. Pour ceux qui veulent passer directement à la pratique, passez à la section suivante.
L'ASCII (American Standard Code for Information Interchange) est l'encodage "de base". Il définit 127 caractères, numérotés de 0 à 127 (de 0000000 à 1111111 en binaire). Dans ces 127 caractères, il y a notre alphabet (en majuscule et minuscule), les chiffres, les signes de ponctuation, mais aussi des caractères non-affichable, comme par exemple l'espace, l'espace insécable, le retour à la ligne, et le caractère de fin de chaîne (pour l'anecdote, le caractère de fin de chaine est le caractère 0, le premier de la liste). Ces caractères de base sont suffisant pour écrire an anglais.
Si vous remarquez bien, il y a 7 bits par caractère. En pratique, on utilise 1 octet, soit 8 bits. On peut donc répéter la même série, en ajoutant un 1 devant, ce qui nous donne 128 caractères de plus (numérotés de 128 à 255). Ces 128 caractères de plus sont donc utilisés pour les accents et autres caractères spécifiques à une langue.
Hep, une minute... 128, c'est bien trop petit pour toutes les langues ! Comment fait-on alors ?
C'est bien ce qui fait notre misère, c'est bien trop peu. C'est pour cela qu'il existe des encodages spécifiques pour chaque langue (ou pour chaque types de langue). Celui utilisé le plus pour le Français, l'espagnol, etc, est nommé ISO-8859-1, ou encore latin-1. Toutefois, chaque famille de système d'exploitation a aussi son propre encodage pour tel ou tel type de langue. D'où nos erreurs sur les caractères : ils sont affichés dans un encodage, différent de celui utilisé par l'émetteur du texte.
Mais ça ne marche pas ton histoire ! Parfois, je vois deux caractères affichés au lieu d'un...
Encore un tour de passe-passe des programmeurs. Ils se sont finalement dits que 128 caractères en plus, c'était bien trop peu. Ils sont donc inventé un nouvel encodage (encore un), destiné à devenir l'unique encodage utilisé sur Terre. Il permet une représentation de tous les caractères de tous les alphabets. Cet encodage miraculeux est l'UTF-8.
Pour arriver à cette prouesse, sans casser complètement la compatibilité avec les autres encodages (notamment l'ASCII d'origine), ils ont défini des règles bien précises. Je vous les donne ci-dessus (pensez à l'aspirine, c'est
très tordu comme système) :
-De 0 à 127 (premier bit 0), on on a un caractère sur un octet.
-Ensuite, le nombre de 1 en début du caractère indique le nombre d'octets sur lequel s'étend le caractère. Chaque octet d'un caractère composé de plusieurs octets doit commencer à 1.
Plus d'infos sur Wikipédia.
Grâce à ces petites astuces, il devient possible de représenter un très grand nombre de caractères. C'est pourquoi cet encodage est de plus en plus utilisé, notamment sur Internet.
Et les programmes, ils font comment pour s'y retrouver dans cette jungle ?
Et bien... ils affiche l'encodage que l'utilisateur leur a demandé d'afficher !
En effet, nativement, les fichiers textes n'ont aucun moyen de définir l'encodage qu'ils utilisent.
Certains langages, comme tous ceux qui sont basés sur XML, ont trouvé un moyen : indiquer l'encodage au début du fichier (en ASCII, pour que ce soit compris par tous). De même pour la plupart des protocoles sur Internet : quand on doit transférer des fichiers textes, le serveur déclare un encodage au début de la transaction. Le client est libre de le suivre, ou de choisir un autre encodage (à ses risques et périls

). Enfin, pour les fichiers textes, c'est l'utilisateur final qui doit paramétrer l'encodage.
Seul souci de cette méthode : les encodages sont déclarés par des humains (celui qui configure le serveur, son éditeur de texte, ou son client) : résultat, les erreurs sont relativement fréquentes.
Conversion d'un encodage à l'autre
Si vus avez essayé de convertir des fichiers textes d'un encodage à l'autre avec votre éditeur de texte, vous avez dû vous apercevoir que c'est relativement pénible. Heureusement, GNU/Linux a un petit programme qui nous facilite bien la vie. Il se nomme judicieusement recode, et s'utilise en ligne de commande. Il permet d'effectuer des conversions de masse, très pratique pour convertir rapidement tous les fichiers d'un projet par exemple.
Pour l'utiliser, il faut commencer par l'installer. Par exemple, sous Debian/Ubuntu :
sudo apt-get install recode
Conversion de fichiers
La syntaxe de base, pour convertir un fichier est :
recode encodage-d-origine..encodage-de-destination fichier
Notez les deux points qui séparent le nom des encodages.
Pour commencer, nous allons convertir un fichier unique. Imaginons que nous avons un fichier nommé
foo.txt, dans l'encodage ISO-8859-1, qui est l'encodage majoritairement utilisé en France, dans l'encodage UTF-8, pour y ajouter des caractères chinois ou japonais :
recode ISO-8859-1..UTF-8 foo.txt
Le fichier d'origine sera écrasé par la conversion de recode. Il n'y aura pas moyen de le retrouver, alors
sauvegardez-le avant !
Il est possible de mettre un astérisque pour convertir plusieurs fichiers (en l'occurrence tous les fichiers avec l'extension .txt) :
recode ISO-8859-1..UTF-8 *.txt
Attention : si vous convertissez les fichiers d'un projet entier,
sauvegardez-les, recode écrasera les fichiers précédents.
Recode gère un nombre phénoménal d'encodages, y compris les entités de caractères HTML et XML. Par exemple, pour supprimer les entités de caractères d'un fichier (et les remplacer par des caractères UTF-8), vous pouvez utilisez la ligne de commande suivante :
recode h4..UTF-8 *.txt
Attention : recode ne fait pas la différence entre les entités dans le texte et les balises. Selon ce que vous lui demandez de faire, il peut convertir les < en < ou inversement. C'est une source d'erreur importante, alors pensez-y !
Conversion directe
Si vous n'indiquez pas de nom de fichier, recode va convertir ce que vous lui envoyez en entrée vers la sortie.
Par exemple, si vous tapez :
recode UTF-8..ISO-8859-1
vous pourrez taper un texte. Dès que vous aurez appuyé sur Ctrl + D, le texte sera renvoyé vers la sortie avec un nouvel encodage.
On peut se servir de cette fonction pour visualiser convenablement certains fichiers, qui ne sont pas dans l'encodage de votre terminal. Par exemple, imaginons que vous ayez un terminal en UTF-8, et que vous voulez lire un fichier nommé
monfichier encodé en ISO-8859-1 :
cat monfichier | recode ISO-8859-1..UTF-8
Vous pouvez également vous en servir pour écrire du texte dans un encodage différent de celui de votre terminal :
echo "Mon terminal est en UTF-8, mais je veut du latin-1" | recode UTF-8..latin-1 > fichier_latin-1.txt
Comme vous avez pu le voir dans cet aperçu, recode est un outil extrêmement pratique pour manipuler les encodages, pourvu que l'on ait un minimum d'expérience.
Documentation complète de recode
Recode est un logiciel qui offre énormément de possibilités.
Pour commencer à vous documenter dessus, vous pouvez lire la page de manuel, mais elle n'est pas très complète :
man recode
Il existe toutefois une documentation beaucoup plus étoffée, accessible via la commande :
info recode
Enfin, pour voir la liste des encodages gérés par recode, vus pouvez utiliser la commande :
recode -l