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

Web Perl Discussion :

problème d'encodage suite à migration sur un nouveau serveur


Sujet :

Web Perl

  1. #1
    Membre éclairé
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Points : 773
    Points
    773
    Par défaut problème d'encodage suite à migration sur un nouveau serveur
    Bonjour,
    je ne sais pas si je suis au bon endroit, mais mon appli "tant sur le web écrite en perl...je tente ma chance ici

    Pour vous expliquer mon problème : j'avais une appli écrite en perl qui tournait très bien sur une redhat 5.5 (apache 2.2, postgresql 8.1.23, perl 5.8.8). La base de données était en UTF8, mes fichiers source perl étaient en UF8, les pages html générées utilisaient charset=utf-8....tout allait bien dans le meilleur des mondes.

    Aujourd'hui, je dois migrer sur un nouveau serveur sous CentOS 7 (apache 2.4, postgresql 9.2.7, perl 5.16.3). Globalement la migration s'est bien passée (quelques ajustements dans le code source à faire, des modules plus compatibles à remplacer)...j'arrive à bien faire tourner tout ça...sauf que j'ai un problème d'encodage et je ne comprends pas d'où ça vient.

    exemple :
    Nom : pbm_encodage_perl_cgi.jpg
Affichages : 339
Taille : 104,1 Ko
    Le texte "Charger une requête favorite" est un <label> généré manuellement et "Envoyer le résultat par e-mail" est un <label> généré par la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     $cgiQuery->checkbox(
            -name  => 'downloadFullList',
            -id    => 'downloadFullList',
            -value => 'downloadFullList',
            -label => 'Envoyer le résultat par e-mail'
        );
    bon, en écrivant ce mail, je commence à entrevoir que le module perl CGI est sans doute en cause (autre exemple : j'utilise un popup_menu que j'alimente avec un hash pour les labels, quand j'affihce dans le logger le contenu, tout est bien forméta en utf8, mais à l'affichage, il pète un plomb).
    Le module CGI est en version 4.13.

    ça vous dit quelque chose?

    Décidément cet encodage c'est vraiment l'enfer...je croyais m'en être sorti....et bam

    Merci ar avance pour votre aide/piste

    Gérald

  2. #2
    Membre éclairé
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Points : 773
    Points
    773
    Par défaut
    juste pour info, sur mon install de pro, le module CGI est en 3.15

  3. #3
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 818
    Points : 499 183
    Points
    499 183
    Par défaut
    Dans le programme, les sources, tu as bien
    ?

  4. #4
    Membre éclairé
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Points : 773
    Points
    773
    Par défaut
    merci Djibril pour ta réponse.

    Pour le moment, je ne l'ai nul part, mais ça marchait bien avant.
    J'ai testé en ajoutant use utf8; sur les sources.
    Nom : pbm_encodage_perl_cgi2.jpg
Affichages : 311
Taille : 107,9 Ko
    ça corrige bien le problème du label généré par GCI, mais par contre tous mes caractères accentués deviennent illisibles...
    j'ai testé sur d'autres interfaces, ça ne corrige pas le problème des caracéres accentués contenus dans les champs CGI->popup_menu par exemple.

    bon, je vais me replonger dans la recherche sur l'encodage utf8 et encore tâtonner avant d'y arriver j'espère....
    mais si vous avez d'autres pistes je suis preneur

    Merci encore

    Gérald

  5. #5
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 818
    Points : 499 183
    Points
    499 183
    Par défaut
    Pour ne pas être embêter, je te dirais de mettre tous les caractères accentués en code HTML eacute... et pour ce qui est des données issues d'une BD, là, tu t'assures qu'elles soient bien encodées en UTF-8.

  6. #6
    Membre éclairé
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Points : 773
    Points
    773
    Par défaut
    passer tous les caractères accentués en codage HTML, je ne trouve pas ça très cool pour la maintenance (et le dev).
    Je vais fouiller un peu pour essayer de trouver une solution....
    merci encore

    Gérald

  7. #7
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 818
    Points : 499 183
    Points
    499 183
    Par défaut
    Difficile sans voir un peu plus de codes.

  8. #8
    Membre éclairé
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Points : 773
    Points
    773
    Par défaut
    Bonjour,
    pour test, j'a fait le petit script suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #!/usr/bin/perl -w
     
    use strict;
    use utf8;
    use CGI;
    my $query  = new CGI;
    print $query->header( -lang => 'fr-FR', -charset => 'utf-8' );
     
    print $query->start_html(
                -title  => "appli",
                -base   => $query->url( -base ),
                -target => '_self',
                -meta   => { 'keywords' => 'traçabilité' }
        );                                                                                                                                                                  print "<h1>testé</H1>";
    print $query->checkbox(
            -name  => 'downloadFullList',
            -id    => 'downloadFullList',
            -value => 'downloadFullList',
            -label => 'Envoyer le résultat par e-mail'
    )."<br />";
     
    my @UsersValues;
    my %UsersHash = {};
    push( @UsersValues, -1,1 );
    $UsersHash{-1} = 'Sélectionnez un utilisateur';
    $UsersHash{1} = 'Gérald';
     
    print   "<label for=\"user\">Manipulateur était : </label>";
    print $query->popup_menu(
        -name    => 'user',
        -id      => 'user',
        -values  => \@UsersValues,
        -labels  => \%UsersHash
    ) . '<br />';
    print $query->end_html();
    dont voici le résultat :
    Nom : encodage_perl_use_utf8.jpg
Affichages : 305
Taille : 24,6 Ko

    si je commente use utf8 dans le code ci-dessus, j'obtiens :
    Nom : encodage_perl_not_use_utf8.jpg
Affichages : 199
Taille : 21,8 Ko

    c'est bizarre non?

    le fichier source est bien en utf8 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    : ~/src/ $ file test.pl
    test.pl: Perl script, UTF-8 Unicode text executable
    j'édite ce fichier qui est sur un serveur centOS via putty qui est bien configuré (window > translation > Remote character set : UTF8).

    Qu'est-ce que je manque?

    Une config du serveur? serveur apache?

    Merci encore pour votre aide
    gérald

  9. #9
    Membre éclairé
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Points : 773
    Points
    773
    Par défaut
    je viens de vérifier la config apache, il y a bien la directive suivante dans le httpd.conf

    AddDefaultCharset UTF-8

  10. #10
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 818
    Points : 499 183
    Points
    499 183
    Par défaut
    Essaye ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #!/usr/bin/perl
    use warnings;
    use strict;
    use CGI;
    use Encode;
     
    my $query  = new CGI;
    print $query->header( -lang => 'fr-FR', -charset => 'utf-8' );
     
    print $query->start_html(
                -title  => "appli",
                -base   => $query->url( -base ),
                -target => '_self',
                -meta   => { 'keywords' => 'traçabilité' }
        );                                                                                                                                                                  print "<h1>testé</H1>";
    print $query->checkbox(
            -name  => 'downloadFullList',
            -id    => 'downloadFullList',
            -value => 'downloadFullList',
            -label => set_texte_utf8('Envoyer le résultat par e-mail')
    )."<br />";
     
    my @UsersValues;
    my %UsersHash = {};
    push( @UsersValues, -1,1 );
    $UsersHash{-1} = set_texte_utf8('Sélectionnez un utilisateur');
    $UsersHash{1} = 'Gérald';
     
    print  "<label for=\"user\">Manipulateur était : </label>";
    print $query->popup_menu(
        -name    => 'user',
        -id      => 'user',
        -values  => \@UsersValues,
        -labels  => \%UsersHash
    ) . '<br />';
    print $query->end_html();
     
    sub set_texte_utf8 {
    	return encode('utf-8', shift);
    }

  11. #11
    Membre éclairé
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Points : 773
    Points
    773
    Par défaut
    le résultat ci-dessous
    Nom : encodage_perl_djibril.jpg
Affichages : 227
Taille : 22,8 Ko

    l'encodage n'est pas géré de le même façon quand il passe par le module CGI j'ai l'impression

  12. #12
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 818
    Points : 499 183
    Points
    499 183

  13. #13
    Membre éclairé
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Points : 773
    Points
    773
    Par défaut
    aucun changement avec ce code

    à noter qu'avec le premier code donné au début de ce fil, sans le "use utf8;", ça passe nickel sur mon ancien serveur

    je continue de fouiller....

  14. #14
    Membre éclairé
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Points : 773
    Points
    773
    Par défaut
    Bon, il y a du mieux....
    recap :
    code source testé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #!/usr/bin/perl
    use warnings;
    use strict;
    use CGI;
    my $query  = new CGI;
    print $query->header( -lang => 'fr-FR', -charset => 'utf-8' );
     
    print $query->start_html(
                -title  => "appli",
                -base   => $query->url( -base ),
                -target => '_self',
                -meta   => { 'keywords' => 'traçabilité' }
        );                                                                                                                                                                  print "<h1>testé</H1>";
    print $query->checkbox(
            -name  => 'downloadFullList',
            -id    => 'downloadFullList',
            -value => 'downloadFullList',
            -label => 'Envoyer le résultat par e-mail'
    )."<br />";
     
    my @UsersValues;
    my %UsersHash = {};
    push( @UsersValues, -1,1 );
    $UsersHash{-1} = 'Sélectionnez un utilisateur';
    $UsersHash{1} = 'Gérald';
     
    print  "<label for=\"user\">Manipulateur était : </label>";
    print $query->popup_menu(
        -name    => 'user',
        -id      => 'user',
        -values  => \@UsersValues,
        -labels  => \%UsersHash
    ) . '<br />';
    print $query->end_html();
    ci-dessous les résultats avec les différentes configs :
    Nom : encodage_perl_1.jpg
Affichages : 194
Taille : 31,7 Ko

    Nom : encodage_perl_2.jpg
Affichages : 284
Taille : 34,1 Ko

    Nom : encodage_perl_3.jpg
Affichages : 255
Taille : 33,1 Ko

    et le config gagnanet est :
    Nom : encodage_perl_4.jpg
Affichages : 294
Taille : 31,4 Ko

    à noter que utf8::all a dû être installé.

    Je teste de ce pas sur les sources de mon appli...
    je vais voir ce que veux dire exactement ce utf8::all, pas cherché encore
    Images attachées Images attachées  

  15. #15
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 818
    Points : 499 183
    Points
    499 183
    Par défaut

  16. #16
    Membre éclairé
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Points : 773
    Points
    773
    Par défaut
    pour mes sources, j'ai ajouté
    use utf8::all; à toutes mes sources .pm et .pl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -type f -name "*.pl" -exec sed -i 2i"use utf8::all;" {} \;
    il a fallu que je positionne le flag tutf8 sur toiut =ce qui est extrait de la BDD :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $dbh->{pg_enable_utf8}=1;
    je suis en train de parcourir toutes mes interfaces et tout ce qui est import/export de fichier, mais j'ai déjà repéré d'autres problèmes que j'investigues....pfff

  17. #17
    Membre éclairé
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Points : 773
    Points
    773
    Par défaut
    suite...
    je fais du download de fichiers binaires qui ne fonctionne plus avec ces modifs :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    open( AFILE, "<$confvar::pathtemp$file" );
    while (<AFILE>) { $data .= $_; }
    close(AFILE);
    il plantait sur le while car s'attendait à recevoir de l'utf8
    il a donc fallu passer le filehandle en binmode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    open( AFILE, "<$confvar::pathtemp$file" );
    binmode AFILE;
    while (<AFILE>) { $data .= $_; }
    close(AFILE);

  18. #18
    Membre éclairé
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Points : 773
    Points
    773
    Par défaut
    Citation Envoyé par gerald2545 Voir le message
    suite...
    il plantait sur le while car s'attendait à recevoir de l'utf8
    il a donc fallu passer le filehandle en binmode
    pas si simple....après ce sont les fichiers texte dont le contenur UTF8 était mal affiché....je désteste ça!!!

    Donc, pour le module de chargement de fichier pas de use utf8::all;
    et le script de chargement de fichier est la suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    open( OUTFILE, ">", $file ) or die "Can't open the file $file";
        ##$logger->debug("Fichier ouvert");
        while (<$fh>) {
        	$logger->debug("Contenu fichier : " . $_);
            print OUTFILE;
        }
    pour la récupération le script contient en entête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    use utf8::all;
    binmode STDIN, ":raw";
    [...]
    if ( defined( $Query->param('downloadFile')){
                use URI::Escape;
                my $file;
                my $base;
     
                $file = $Query->param('downloadFile');
                $base = $confvar::pathtemp;
     
                my ($filename) = fileparse($file);
                my $fileURLencoded = uri_escape($filename);
                print "Content-Type:application/octet-stream; name=\"$file\"\r\n";
                print "Content-Disposition: attachment; filename=\"$filename\";filename*=UTF-8''$fileURLencoded\r\n\n";
     
                 #Actual File Content will go here.
                 open( FILE, "<:raw","$base$file" ) or die("Impossible d'ouvrir le fichier $base$file ") ;
                 binmode STDOUT;
                 my $buffer = '';
                 while(read(FILE, $buffer, 100) ){
                    $logger->debug("Contenu fichier : ".$buffer);
                    print($buffer);
                }
                close FILE;
                exit;
            }
    me demandez pas comment ça marche, avec ces binmode, open <:raw....
    testé sur fichiers texte avec caractère utf8 et différents fichiers bianaires....ça a l'air de fonctionner...du coup j'ai vite commité!!

Discussions similaires

  1. Problème d'encodage suite à refresh
    Par daniel_chiaramello dans le forum Struts 1
    Réponses: 2
    Dernier message: 12/11/2008, 17h18
  2. Migration sur un nouveau serveur
    Par Bidouille dans le forum Installation
    Réponses: 1
    Dernier message: 07/09/2007, 13h34
  3. Réponses: 3
    Dernier message: 20/06/2007, 19h42

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