/ / Qu'est-ce qui pourrait amener un script cgi perl à interpréter de manière incorrecte les données de formulaire envoyées comme codées en utf-8? - perl, utf-8, cgi

Qu'est-ce qui pourrait amener un script cgi de perl à interpréter de manière incorrecte les données de formulaire publiées en codage utf-8? - perl, utf-8, cgi

"Je recherche la cause d’une erreur qui a amené un script CGI Perl à écrire des valeurs incorrectes dans la base de données.

Ce script Perl reçoit des données d'un autre système (pas d'un navigateur) qui utilise définitivement le codage ISO-8859-1. Les données incorrectes, telles qu'elles sont écrites dans la base de données, ressemblent à ceci:

Gro�Gr�nF�rbung�sterreich

quand ça devrait être

GroßGrünFärbungÖsterreich

J'ai découvert que je pouvais créer une entrée de base de données aussi erronée en modifiant le script à utiliser. decode("utf8", $xyz) au lieu de $xyz. Ma question est donc la suivante: y at-il des influences, par exemple En-têtes HTTP, variables d'environnement, fichiers de configuration, etc. susceptibles de provoquer cette opération du module CGI perl decode implicitement?

Code source original:

my $ack = new CGI;
my $xyz = $ack->param( "xyz" );

dans certains cas, se comporte apparemment comme:

use Encode qw(decode encode);
my $ack = new CGI;
my $xyz = decode("utf8",$ack->param( "xyz" ));

Réponses:

2 pour la réponse № 1

Vous devez gérer toutes les données provenant de l'extérieur du programme Perl lui-même sous forme d'octets de données brutes (octets). Si vous explicitement alors decode avec votre codage supposé, traitez-le en Perl (dans son format natif) et encode avec le codage que vous souhaitez mettre hors de votre programme (comme dans votre cas, dans la base de données), vous êtes du bon côté. Tout le reste pourrait mal se passer, comme vous pouvez le voir.

Lorsque vous utilisez des descripteurs (tels que des fichiers ou des sockets), vous pouvez le faire en utilisant la couche PerlIO, vous n’avez donc pas à utiliser explicitement décodage / codage.