web-dev-qa-db-fra.com

Conversion d'un fichier UTF-8 en ASCII (meilleur effort)

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.

27
user7610
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 ...

13
Radovan Garabík

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.

29
yellowantphil

essayez uni2ascii -B input.txt >output.txt

ni2ascii

5
philcolbourn

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.

2
user7610

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

2
RedGrittyBrick