Question

J'ai un script Perl appelé par des tiers pour m'envoyer le nom des personnes qui ont enregistré mon logiciel. Une de ces parties code les noms en UTF-8. J'ai donc adapté mon script en conséquence pour décoder UTF-8 en ASCII avec Encode :: decode_utf8 (...).

Cela fonctionne généralement bien, mais tous les six mois environ, l’un des noms contient des caractères cyrilliques, grecs ou roumains. Par conséquent, le décodage du nom produit des caractères incohérents tels que "& # 208; & # 376; & # 208; & # 190; & # 208; & # 180; & # 209; & # 8364; & # 208; & # 176; & # 208; & # 182; & # 208; & # 176; & # 208; & # 208; & ### 189; & # 209; & # 208; & # 186; & # 208; & # 176; & # 209; " ;. Je dois faire un suivi auprès du client et lui demander une "version pour les caractères latins". de son nom afin d’émettre un code d’enregistrement.

Alors, y a-t-il un module Perl capable de détecter s’il existe de tels caractères et de les traduire automatiquement en représentation ASCII la plus proche, si nécessaire?

Il semble que je puisse utiliser Lingua :: Cyrillic :: Translit :: OACI ainsi que Lingua :: DetectCharset pour gérer le cyrillique, mais je préférerais quelque chose qui fonctionne également avec d'autres jeux de caractères.

Était-ce utile?

La solution

Je pense que vous pouvez utiliser Text :: Unidecode pour cela, c'est précisément ce qu'il essaie de faire.

Autres conseils

Si vous devez traiter des données UTF-8 qui ne se trouvent pas dans la plage ascii, le mieux est de modifier votre back-end pour ne pas vous étouffer avec utf-8. Comment feriez-vous pour translittérer les signes kanji?

Si vous obtenez un texte cyrillique, il n'y a pas de "représentation ASCII la plus proche". pour de nombreux personnages.

Dans la documentation de Text :: Unicode, sous "Mises en garde", il apparaît que cette phrase est incorrecte:

Assurez-vous que les données d'entrée sont vraiment une chaîne utf8.

UTF-8 est un codage de longueur variable, alors que Text :: Unidecode accepte uniquement un codage de longueur fixe (deux octets) pour chaque caractère. Donc, cette phrase devrait se lire:

Assurez-vous que les données d'entrée sont réellement une chaîne de caractères Unicode à deux octets.

Ceci est également appelé UCS-2.

Si vous voulez convertir des chaînes qui sont vraiment utf8, vous devriez le faire comme suit:

my $decode_status = utf8::decode($input_to_be_converted);
my $converted_string = unidecode ($input_to_be_converted);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top