Questo non ha nulla a che fare con la codifica di stringa interna di Perl, ma con la necessità di decodificare correttamente i dati provenienti dall'esterno. Fornirò il caso di test. Questo è Strawberry Perl 5.10 su un Windows XP europeo 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;
Esegui:
> set TEST=abc£
> B:\sperl\perl\bin\perl.exe B:\test1.pl
uscita (abbreviato):
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}"]
Viene morso dal fatto che Windows utilizza una codifica diversa per l'ambiente di testo (IBM850) rispetto all'ambiente grafico (Windows-1252). Un esperto deve spiegare i dettagli più profondi di quel fenomeno.
Modifica:
E 'possibile euristico (il che significa che sarà in grado di fare la cosa giusta a volte, soprattutto per queste stringhe brevi) determinare codifiche. La migliore soluzione generica è Encode::Detect/Encode::Detect::Detector basata su Mozilla nsUniversalDetector.
Esistono alcuni modi per decodificare implicitamente dati esterni come open
pragma/IO layers e -C
switch, tuttavia essi gestiscono solo i flussi di file e gli argomenti del programma. A partire da ora, dall'ambiente deve essere decodificato in modo esplicito. Mi piace comunque, spiega esplicitamente che il programmatore di manutenzione ha pensato che il topic attraverso.
Si otterrebbero risposte molto più rapidamente se si fornisce codice minimo che mostri il problema. Se la descrivi semplicemente con le parole, c'è molto più che altro per l'immaginazione e la confusione. – daxim
Come mai, nessuna delle dozzine di risposte che hai ricevuto per le sei domande che hai chiesto è stata sufficiente per essere accettata? –
Sì, l'ho fatto ora. – Kartlee