Comment utiliser la commande iconv sous Linux

Les ordinateurs stockent les caractères en les associant à différentes valeurs binaires. Pour les afficher correctement, vous devez savoir comment ils ont été encodés. La commande iconv convertit un fichier en un nouveau codage.


C’est du binaire jusqu’au bout

Quel que soit le type de données avec lesquelles un ordinateur travaille ou qu’il stocke, elles sont conservées sous forme d’informations binaires. Les images, le texte, la musique, la vidéo et tout le reste sont stockés sous forme de données binaires. Que les données se trouvent sur un périphérique de stockage ou qu’elles soient chargées dans la mémoire de l’ordinateur, elles sont toujours représentées par des valeurs binaires.

Si les données sont du texte et que nous voulons afficher ce texte à l’écran, une traduction doit être effectuée pour convertir les valeurs binaires en caractères. Pour effectuer cette conversion, nous devons savoir quelles valeurs ont été utilisées pour représenter chaque caractère lorsque les données ont été créées. Le logiciel peut alors travailler à rebours et convertir les valeurs numériques stockées en caractères.

Parce que le succès dépend de la connaissance du type de mappage utilisé et du respect rigoureux des règles de mappage lors de la création et de l’utilisation des données, des normes ont été créées pour formaliser ces mappages de caractères. Elles sont faciles à comprendre si l’on comprend bien le jargon.

Caractères, octets et cartographie

A personnage est une lettre, un chiffre ou tout autre symbole affichable, comme les symboles de ponctuation, les signes mathématiques tels que l’égal « = » et le plus « + », et les symboles monétaires. La chose que vous voyez à l’écran et qui représente cette lettre s’appelle un glyphe, et un ensemble de glyphes constitue une police de caractères.

A police de caractères est ce que beaucoup de gens appellent à tort une police de caractères. Au sens strict, une police de caractères est une version d’une police de caractères qui a été modifiée, par exemple en augmentant ou en diminuant sa taille, ou en changeant son poids pour rendre les lignes des glyphes plus épaisses ou plus fines. Quelle que soit la police, la représentation numérique du caractère reste la même.

L’ensemble des caractères d’une même cartographie est appelé le jeu de caractères. Chaque caractère d’un jeu a sa propre valeur numérique, fixe et unique, appelée point de code. Si un caractère ou un symbole n’apparaît pas dans le jeu de caractères – c’est-à-dire qu’il n’y a pas de point de code pour lui – il ne peut pas être affiché en utilisant ce jeu de caractères. Le nombre d’octets utilisés pour représenter un seul caractère est un élément important à prendre en considération. Plus vous utilisez d’octets par caractère, plus vous pouvez inclure de caractères dans le jeu.

Le grand-père de tous les jeux de caractères à un octet est la norme ASCII. Elle date de la fin des années 1960, lorsqu’une norme de 7 bits a été établie pour coder 128 points de code différents destinés à être utilisés par les téléimprimeurs. En revanche, la norme Unicode contient un total de 1 114 112 points de code. Un espace de code aussi vaste est nécessaire parce qu’Unicode tente de fournir un support de mappage de caractères pour toutes les langues humaines.

L’utilisation d’un nombre fixe d’octets pour stocker les points de code est un gaspillage. Si un point de code n’a besoin que d’un octet pour être identifié, les autres octets réservés à ce point de code sont redondants. Les jeux de caractères multibytes à longueur variable Unicode utilisent un nombre variable d’octets pour les points de code, jusqu’à quatre octets étant nécessaires pour décrire un point de code compliqué.

Un point de code peut donc avoir à coder deux types de données. Il doit identifier le caractère qu’il représente et contenir des métadonnées le concernant, comme le nombre d’octets du point de code. En outre, certains caractères doivent être combinés avec d’autres caractères pour obtenir le glyphe final, de sorte que le point de code doit également coder cette information.

L’avantage d’un schéma à longueur variable est que vous n’utilisez que les octets dont vous avez réellement besoin. C’est efficace et cela permet d’obtenir des fichiers plus petits. L’inconvénient est que les données sont plus compliquées à lire et à analyser. Et la conversion d’un jeu de caractères à un autre peut devenir très difficile, très rapidement.

C’est là qu’intervient la commande iconv.

Comment utiliser la commande iconv

Ce qui manque à la commande iconv en termes d’options de ligne de commande est largement compensé par le nombre d’encodages de caractères qu’elle prend en charge. Elle répertorie plus de 1100 encodages différents, mais beaucoup sont des alias pour la même chose. Nous pouvons lister tous les encodages supportés en utilisant l’option -l (list).

iconv -l

La sortie de la commande iconv -l, listant tous les encodages de caractères connus par iconv.

Pour utiliser iconv, vous devez spécifier un fichier source et un fichier de sortie, ainsi que l’encodage à partir duquel vous convertissez et l’encodage vers lequel vous convertissez. Si vous ne spécifiez pas de noms de fichiers, iconv utilise STDIN et STDOUT, prenant son entrée depuis la ligne de commande et écrivant sa sortie dans la fenêtre du terminal. Vous pouvez acheminer des données vers iconv, et vous pouvez également rediriger sa sortie vers un fichier.

Nous allons utiliser iconv avec STDIN pour illustrer certains points. Nous devons spécifier l’encodage du texte d’entrée, nous utiliserons donc la commande locale pour découvrir ce qu’il est.

locale

La sortie de la commande locale, sur un ordinateur sous Ubuntu configuré pour les Etats-Unis

La première ligne indique que nous utilisons l’anglais américain et l’encodage Unicode UTF-8. Notre chaîne de test contient du texte brut, un mot accentué, un caractère non anglais (le caractère allemand eszett (ß), et le symbole monétaire de l’euro.

plain àccented non-English ß Foreign currency €

Nous allons convertir ce texte en ASCII. Nous utilisons echo pour envoyer notre texte d’entrée à iconv. Nous utilisons l’option -f (from) pour spécifier que l’encodage d’entrée est UTF-8, et l’option -t (to) pour indiquer que nous voulons la sortie en US-ASCII.

echo plain àccented non-English ß Foreign currency € | iconv -f UTF-8 -t US-ASCII

La commande iconv s'arrête sur une erreur

Cette commande échoue dès le premier obstacle. Il n’y a pas de caractère équivalent en US-ASCII pour « à », donc la conversion est abandonnée. iconv utilise un comptage à zéro décalage, donc on nous dit que le problème s’est produit à la position six. Si nous ajoutons l’option -c (continue), iconv éliminera les caractères non convertibles et continuera à traiter le reste de l’entrée.

echo plain àccented non-English ß Foreign currency € | iconv -f UTF-8 -t US-ASCII

Utilisation de l'option -c pour qu'iconv ignore les erreurs et continue le traitement

La commande s’exécute jusqu’à la fin, mais il manque des caractères dans la sortie. Nous pouvons faire en sorte qu’iconv fournisse une approximation d’un caractère non convertible en lui substituant un caractère similaire, ou une autre représentation. S’il n’y parvient pas, il insère un point d’interrogation  » ? » pour que vous puissiez facilement voir qu’un caractère n’a pas été converti.

Ce processus est appelé translittérationet pour l’invoquer, vous devez ajouter la chaîne « //TRANSLIT » à l’encodage cible.

echo plain àccented non-English ß Foreign currency € | iconv -f UTF-8 -t US-ASCII//TRANSLIT

Demander à iconv d'utiliser la translittération pour remplacer les caractères manquants par un substitut proche

Nous avons maintenant un texte de sortie complet, avec « a » à la place de « à » et « ss » à la place de « ß », et « EUR » à la place du symbole monétaire « € ».

Utiliser iconv avec des fichiers

L’utilisation d’iconv avec des fichiers est très similaire à son utilisation en ligne de commande. Pour connaître le type d’encodage du fichier source, nous pouvons utiliser la commande file.

file -i input.txt

Utilisation de la commande file pour découvrir le codage des caractères d'un fichier texte

Notre fichier d’entrée est codé en UTF-16LE. Il s’agit d’un encodage 16 bits little-endian. Il ressemble à ceci :

less input.txt

Le contenu d'un fichier texte encodé en UTF-16LE

Si vous plissez les yeux et lisez les caractères en blanc, vous pouvez distinguer les chaînes de texte proprement dites. De nombreux logiciels traitent incorrectement un tel fichier comme un fichier binaire, nous allons donc le convertir en UTF-8.

Nous utilisons l’option -f (from) pour spécifier l’encodage du fichier d’entrée, et l’option -t (to) pour indiquer à iconv que nous voulons la sortie en UTF-8. Nous devons utiliser l’option -o (output) pour nommer le fichier de sortie. Nous n’utilisons pas d’option pour nommer le fichier d’entrée, nous indiquons simplement à iconv comment il s’appelle.

iconv -f UTF-16LE -t UTF-8//TRANSLIT input.txt -o output.txt

Convertir un fichier texte vers un nouvel encodage de caractères avec iconv

Notre fichier de sortie ressemble à ceci :

less output.txt

Le contenu du fichier texte converti

Le pouvoir quand vous en avez besoin

Vous n’utilisez peut-être pas iconv fréquemment, mais lorsque vous en avez besoin, il peut vous sauver la mise.

Je reçois beaucoup de fichiers de personnes qui utilisent des ordinateurs Windows ou Mac, et souvent de l’étranger. Ils arrivent dans toutes sortes d’encodages. J’ai béni iconv plus d’une fois pour m’avoir permis de travailler facilement avec ces fichiers sous Linux.

Laisser un commentaire