"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 № 1Vous 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.