IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

panic: reg_node overrun trying to emit 63


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Homme Profil pro
    Responsable Informatique
    Inscrit en
    Août 2010
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 42
    Points : 118
    Points
    118
    Par défaut panic: reg_node overrun trying to emit 63
    Bonjour à tous,

    Débutant en Perl, je rencontre un soucis lors de l'évaluation d'une expression régulière avec des caractères chinois. J'ouvre bien le fichier en UTF-8, mais je rencontre le message suivant lors de l'exécution du script :

    panic: reg_node overrun trying to emit 63.

    Après quelques recherches, je n'arrive pas à comprendre le sens du message d'erreur. Et après quelques tests appronfondis, j'arrive à des trucs complètement bizarre :

    Mon fichier contient la ligne suivante :

    <tr><td class="fins_title1"><B>Address</B></td><td class="fins_title2">山东省枣庄市邳庄村#(ShanDongShengZaoZhuangShiZuoZhuangCun)</td></tr>

    Et il me faut extraire l'adresse en Chinois et celle en Pinyin. J'utilise pour ça un regex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /<td class="fins_title2">(\p{Han}+)#\(([ a-z]+)\)<\/td>/i
    C'est là que j'obtiens l'erreur.

    Maintenant, en simplifiant la regex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /<td class="fins_title2">(\p{Han}+)/i    => Même erreur
    /ss="fins_title2">(\p{Han}+)/i           => Même erreur
    /s="fins_title2">(\p{Han}+)/i            => OK (??????? pourquoi ?????)
    /ss="fins_title2">(.+)/i                 => OK (A cause des charactères chinois qui passent pas ?????)
    Bref, je trouve que c'est assez du délire, et je comprends vraiment rien à l'histoire...

    Merci d'avance pour votre aide.

  2. #2
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Bonjour,

    Je me lance sans prétention

    J'ouvre bien le fichier en UTF-8
    C'est incontournable bien sûr mais, mais suivant ce que tu fais, ça ne suffit pas.
    Il faut avoir en tête d'être UTF-8 sur TOUTE LA LIGNE.

    UTF-8 sur TOUTE LA LIGNE ça veut dire :
    - Ouverture et traitement des fichiers (pour ça tu sembles OK) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open IN_Fic, '<:encoding(UTF-8)', $fichier_titre
    - Si tu traites des libellés en chinois à l'intérieur du programme perl.pl il ne faut pas oublier use utf8; :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #!/usr/bin/perl
    use strict;
    use warnings;
    use utf8;
    - Dans les expressions régulières dans la mesure du possible utilise la notation UTF-8 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $Lig =~ s/\x{064E}\x{0627}/\x{0627}/go; # Supprime Fatha devant Alif ?
        $Lig =~ s/\x{064E}\x{0649}/\x{0649}/go; # Supprime Fatha devant Alif marsour ?
        $Lig =~ s/\x{0650}\x{064A}/\x{064A}/go; # Supprime Kasra devant Ya ?
        $Lig =~ s/\x{064F}\x{0648}/\x{0648}/go; # Supprime Damma devant Oua ?
    Là, ce sont des caractères arabes.

    - Enfin le code de tes programmes doivent être eux-même sauvegardés UTF-8
    Regarde donc les possibilités de ton éditeur de texte préféré...
    Perso je sauvegarde en UTF-8 NOBOM

    [EDIT 15:20] HTML
    Bien sûr le code html doit lui aussi être sauvegardé UTF-8 NOBOM
    et comporter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    Il doit y avoir des choses similaires à prévoir si tu utilises PHP et autres langages...

    Je ne suis pas certain que ça te soit utile !
    C'est par solidarité car j'ai beaucoup galéré moi-même...

    Bon courage

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Pour ma part, j'ai pu résoudre le problème de deux manières:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    use strict;
    use warnings;
    use utf8;
    use Encode;
     
    my $data = '<tr><td class="fins_title1"><B>Address</B></td><td class="fins_title2">山东省枣庄市邳庄村#(ShanDongShengZaoZhuangShiZuoZhuangCun)</td></tr>';
     
    if ($data =~ /<td class="fins_title2">(\p{Han}+)#\(([ a-z]+)\)<\/td>/iu) {
    	print encode("utf-8", $1) ."\n" . $2; 
    }
    (voir par ici, à propos du modificateur /u)

    Remarque: on peut aussi séparer artificiellement les deux s en écrivant /<td clas[s]=.../i.

    ou:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    use strict;
    use warnings;
    use utf8;
    use feature 'unicode_strings';
    use Encode;
     
    my $data = '<tr><td class="fins_title1"><B>Address</B></td><td class="fins_title2">山东省枣庄市邳庄村#(ShanDongShengZaoZhuangShiZuoZhuangCun)</td></tr>';
     
    if ($data =~ /<td class="fins_title2">(\p{Han}+)#\(([ a-z]+)\)<\/td>/i) {
    	print encode("utf-8", $1) ."\n" . $2; 
    }
    (...et par là, pour use feature 'unicode_strings';)

    si ça peut te donner des pistes.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25
  3. Tri par fusion d'un tableau
    Par Mailgifson dans le forum C
    Réponses: 5
    Dernier message: 12/12/2002, 14h53
  4. [VBA-E] [Excel] Tri automatique
    Par bovi dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/10/2002, 10h19
  5. [] Tri d'un tableau par ordre alphabétique
    Par cafeine dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 17/09/2002, 08h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo