[Perl] Détecter un champ en UTF-8

Détecter un champ en UTF-8 [Perl] - Perl - Programmation

Marsh Posté le 16-04-2018 à 19:02:37    

Bonjour,
 
C'est encore moi :)
 
Alors voilà, j'ai un fichier à parser avec des titres, certains malheureusement sont illisibles car en utf-8
Mon but est simplement de pourvoir les identifier et de ne pas les prendre en compte
 
Voici le code:

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5. use Encode;
  6. use utf8;
  7. my $file = "data";
  8. if (-e $file) {
  9.         open (TOP, "<", $file);
  10.         while (<TOP> ) {
  11.                 chomp;
  12.                 my ($id, $name) = split(/\|/, $_);
  13.                 my $flag = utf8::valid($name);
  14.                 print "$flag|$id|$name", "\n";
  15.         }
  16.         close(TOP);
  17. }
  18. else {
  19.         print "No file", "\n";
  20. }


 
Le fichier source:

Code :
  1. TST0015108239|A Certain Point Of View Teaser 1
  2. TST0015112182|RNS 2009 - Soma Salegy 1
  3. TST0015113611|Otto act3
  4. TST0015113892|Clip - Morgan Priest : The future
  5. TST0015114112|Clip - Morgan Priest : L'action a un nouveau visage
  6. TST0015114974|Style and Tecknik (SNT) - Breakdance
  7. TST0015115312|Gis¦le
  8. TST0015116679|PAC MAN (REMI GAILLARD)
  9. TST0015120331|WakeBox Aquaboulevard de Paris
  10. TST0015116649|Yer Siyah, Gök Beyaz, Åžampiyonsun BeÅŸiktaÅŸ Marşı  Klarnet
  11. TST0015120553|Tuto application iPhone iPod remote
  12. TST0015121223|Hello Geekette - Teaser Saison 1
  13. TST0015122260|Miniature Replica Soldier - F.E.A.R. 2
  14. TST0013116679|La Boîte à  Bidouilles - Le téléphone high tech !


 
Je pensai qu'en utilisant utf8::valid($string) il allait me dire avec booléen si oui ou non le champ était en UTF-8
Mais il me répond 1 à chaque fois
Je m'attendais à pouvoir identifier la ligne 10 et 14 mais là en fait non.
 
Merci d'avance pour votre aide future

Reply

Marsh Posté le 16-04-2018 à 19:02:37   

Reply

Marsh Posté le 17-04-2018 à 00:03:24    

Toute tes chaînes sont en utf8. Il est donc logique que utf8::valid renvoie 1 dans tous les cas.
Ce que tu veux tester, si j'ai bien compris, c'est si ces chaînes sont représentables dans l'encoding de la console de ta machine.
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5. use Encode qw(decode);
  6. use utf8;
  7.  
  8. open my $file, "<", "data8.txt";
  9. while (<$file> ) {
  10.    $_ = decode("utf8", $_);
  11.    print if (utf8::downgrade($_, 1));
  12. }


 
Ça donne en sortie:
 

TST0015108239|A Certain Point Of View Teaser 1
TST0015112182|RNS 2009 - Soma Salegy 1
TST0015113611|Otto act3
TST0015113892|Clip - Morgan Priest : The future
TST0015114112|Clip - Morgan Priest : L'action a un nouveau visage
TST0015114974|Style and Tecknik (SNT) - Breakdance
TST0015116679|PAC MAN (REMI GAILLARD)
TST0015120331|WakeBox Aquaboulevard de Paris
TST0015120553|Tuto application iPhone iPod remote
TST0015121223|Hello Geekette - Teaser Saison 1
TST0015122260|Miniature Replica Soldier - F.E.A.R. 2


decode("utf8", $_) va mettre tes données dans la représentation interne de Perl (normalement en utf8 aussi, vu le use utf8, mais ça marchait pas directement, même en forçant la lecture du fichier en utf8, je ne sais pas trop pourquoi, donc je force le décodage après une lecture en mode caractère), et utf8::downgrade($_, 1) va rendre faux si la dégradation en donnée dans l'encoding de la machine (cp850 sur ma machine) est avec pertes, donc si la chaîne initiale n'est pas directement utilisable.
 
A+,


Message édité par gilou le 17-04-2018 à 00:14:11

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 17-04-2018 à 10:54:17    

C'est parfait !
Merci Gilou

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed