J'ai un fichier en UTF-8 qui contient des textes en plusieurs langues. Beaucoup sont des noms de personnes. J'ai besoin de le convertir en ASCII et j'ai besoin que le résultat soit aussi décent que possible.
Il existe de nombreuses façons d'aborder la conversion d'un codage plus large en un codage plus étroit. La transformation la plus simple serait de remplacer tous les caractères non ASCII par un espace réservé, comme "_". Si je connais la langue dans laquelle le fichier est écrit, il existe des possibilités supplémentaires, comme la romanisation.
Quel outil Unix ou bibliothèque de langage de programmation disponible sur Unix peut me donner une conversion décente (au mieux) d'UTF-8 en ASCII?
La plupart du texte est en langues européennes de type latin.
konwert utf8-ascii
Il effectuera la conversion au mieux, en fonction des tables de conversion. Si vous connaissez approximativement la langue d'entrée, il existe des filtres spécifiques à la langue qui donnent de meilleurs résultats, par ex.
konwert utf8-xmetodo
est la conversion de l'espéranto en représentation x-metodo,
konwert UTF8-tex
va essayer de faire une représentation TeX des signes diacritiques, il y a des paramètres spécifiques au langage:
konwert UTF8-ascii/de
translittérera "ä" en "ae" (usuel pour l'allemand) au lieu de "a"
konwert UTF8-ascii/rosyjski
utilisera les règles polonaises pour translittérer le russe, au lieu de celles "anglaises", etc ...
Cela fonctionnera pour certaines choses:
iconv -f utf-8 -t ascii//TRANSLIT
echo ĥéĺłœ π | iconv -f utf-8 -t ascii//TRANSLIT
Retour helloe ?
. Tous les caractères que iconv
ne sait pas convertir seront remplacés par des points d'interrogation.
iconv
est POSIX, mais je ne sais pas si tous les systèmes ont l'option TRANSLIT
. Cela fonctionne pour moi sur Linux. De plus, l'option IGNORE
supprimera silencieusement les caractères qui ne peuvent pas être représentés dans le jeu de caractères cible (voir man iconv_open
).
Une option inférieure mais compatible POSIX consiste à utiliser tr
. Cette commande remplace tous les points de code non ASCII par un point d'interrogation. Il lit le texte UTF-8 un octet à la fois. "É" pourrait être remplacé par E?
ou ?
, selon qu'il a été codé à l'aide d'un accent de combinaison ou d'un caractère précomposé.
echo café äëïöü | tr -d '\200-\277' | tr '\300-\377' '[?*]'
Cet exemple renvoie caf? ?????
, en utilisant des caractères précomposés.
essayez uni2ascii -B input.txt >output.txt
J'ai fini par utiliser Perl avec Text :: Unidecode pour cela. Exemple:
Perl -e 'use utf8; use Text::Unidecode; print unidecode("عبد الله الثاني بسين")
produit bd llh lthny bn lHsyn
, ce qui est un résultat acceptable pour mes besoins.
J'ai un fichier en UTF-8 qui contient [les noms des personnes] dans plusieurs langues [que je veux convertir en quelque chose de significatif en ASCII].
Vous voulez dire que vous voulez pouvoir convertir les noms suivants en une chaîne ASCII à laquelle la personne concernée ne s’opposerait pas?
Je soupçonne qu'aucun outil automatisé ne peut le faire. Il peut y avoir soit pas ou beaucoup de latinisations de noms personnels. Le logiciel ne peut pas choisir la version culturellement acceptable. Du moins pas sans que le logiciel en sache beaucoup sur la culture de la personne impliquée.
Voir aussi https://stackoverflow.com/a/1398403/477035