Comment puis-je utiliser correctement les variables d’environnement codées comme Windows-1251 dans Perl?

J’ai une variable d’environnement définie dans Windows comme TEST=abc£ qui utilise la page de codes Windows-1252 . Maintenant, lorsque je lance un programme Perl, test.pl cette valeur de l’environnement est correcte.

Lorsque j’appelle un autre code Perl – test2.pl de test1.pl soit par le system(..) ou Win32::Process , l’environnement est déformé.

Est-ce que quelqu’un peut fournir des informations pourquoi cela pourrait être et comment le résoudre?

La version de perl j’utilise est 5.8.

Si ma compréhension est correcte, perl utilise en interne utf-8 , donc le processus initial – test1.pl reçu directement de Windows-1252utf-8 . Lorsque nous appelons un autre processus, devons-nous convertir à nouveau la page de code Windows-1252 ?

Cela n’a rien à voir avec l’encodage interne des chaînes de Perl, mais avec le besoin de décoder correctement les données provenant de l’extérieur. Je vais fournir le cas de test. Ceci est Strawberry Perl 5.10 sur un Windows XP de l’Europe occidentale.

test1.pl:

 use Devel::Peek; print Dump $ENV{TEST}; use Encode qw(decode); my $var = decode 'Windows-1252', $ENV{TEST}; print Dump $var; system "B:/sperl/perl/bin/perl.exe B:/test2.pl"; 

test2.pl:

 use Devel::Peek; print Dump $ENV{TEST}; use Encode qw(decode); my $var = decode 'IBM850', $ENV{TEST}; # using Windows-1252 again is wrong here print Dump $var; 

Exécuter:

 > set TEST=abc£ > B:\sperl\perl\bin\perl.exe B:\test1.pl 

Sortie (raccourcie):

 SV = PVMG(0x982314) at 0x989a24 FLAGS = (SMG, RMG, POK, pPOK) PV = 0x98de0c "abc\243"\0 SV = PV(0x3d6a64) at 0x989b04 FLAGS = (PADMY, POK, pPOK, UTF8) PV = 0x9b5be4 "abc\302\243"\0 [UTF8 "abc\x{a3}"] SV = PVMG(0x982314) at 0x989a24 FLAGS = (SMG, RMG, POK, pPOK) PV = 0x98de0c "abc\243"\0 SV = PV(0x3d6a4c) at 0x989b04 FLAGS = (PADMY, POK, pPOK, UTF8) PV = 0x9b587c "abc\302\243"\0 [UTF8 "abc\x{a3}"] 

Vous êtes mordu par le fait que Windows utilise un encodage différent pour l’environnement de texte (IBM850) que pour l’environnement graphique (Windows-1252). Un expert doit expliquer les détails plus profonds de ce phénomène.

Modifier:

Il est possible de déterminer de manière heuristique (ce qui signifie qu’il échoue parfois à faire les choses correctement, en particulier pour de telles chaînes courtes) pour déterminer les encodages. La meilleure solution à usage général est Encode :: Detect / Encode :: Detect :: Detector qui est basé sur Mozilla nsUniversalDetector .

Il existe des moyens de décoder implicitement des données externes telles que les couches pragma / IO open et le commutateur -C , mais elles ne traitent que des stream de fichiers et des arguments de programme. A partir de maintenant, l’environnement doit être décodé explicitement. J’aime ça mieux quand même, explicite montre le programmeur de maintenance que vous avez pensé à travers le sujet .