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 encodage plus large en un encodage 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) de UTF-8 en ASCII?
La plupart du texte est en langues européennes de type latin.
la source
iconv
ettr
, il existe Unidecode . Je ne le connais pas, mais il pourrait faire ce que vous voulez, si vous pouvez utiliser Python.Réponses:
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 exemple
est la conversion de l'espéranto en représentation x-metodo,
va essayer de faire une représentation TeX des signes diacritiques, il y a des paramètres spécifiques au langage:
translittérera "ä" en "ae" (coutume pour l'allemand) au lieu de "a"
utilisera les règles polonaises pour translittérer le russe, au lieu de celles "anglaises", etc ...
la source
konwert
site Web? Est-il emballé n'importe où? github.com/taw/konwert/tree/master/konwert-1.8Cela fonctionnera pour certaines choses:
echo ĥéĺłœ π | iconv -f utf-8 -t ascii//TRANSLIT
retournehelloe ?
. Tous les caractères quiiconv
ne savent 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'TRANSLIT
option. Cela fonctionne pour moi sur Linux. En outre, l'IGNORE
option supprimera silencieusement les caractères qui ne peuvent pas être représentés dans le jeu de caractères cible (voirman iconv_open
).Une option inférieure mais compatible POSIX est à 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. «É» peut être remplacé parE?
ou?
, selon qu'il a été codé à l'aide d'un accent de combinaison ou d'un caractère précomposé.Cet exemple revient
caf? ?????
, en utilisant des caractères précomposés.la source
tr
n'est pas censé fonctionner un octet à la fois. GNU tr le fait, mais c'est un bug.iconv -f utf-8 -t ascii//TRANSLIT
a bien fonctionné pour moi. Il a changé les guillemets bouclés en guillemets droits. Merci.//TRANSLIT
fonctionne également pour d'autres jeux de caractères, par exempleiso-8859-1//TRANSLIT
.iconv
donneiconv: illegal input sequence at position 1234
et tronque le fichier pour moi. Ce serait bien s'il supprimait simplement le personnage et tentait de reprendre la séquence.essayer
uni2ascii -B input.txt >output.txt
uni2ascii
la source
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 également /programming//a/1398403/477035
la source
perl -e 'use utf8; use Text::Unidecode; print unidecode("عبد الله الثاني بسين")'
produit `` bd llh lthny bn lHsyn` qui est assez bonne translittération pour mes besoins.J'ai fini par utiliser Perl avec Text :: Unidecode pour cela. Exemple:
produit
bd llh lthny bn lHsyn
, ce qui est un résultat acceptable à mes fins.la source