Это не имеет ничего общего с внутренним строковым кодированием Perl, но с необходимостью правильно декодировать данные, поступающие извне.Я предоставлю контрольный пример.Это Strawberry Perl 5.10 в западноевропейской Windows XP.
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;
Выполнить:
> set TEST=abc£
> B:\sperl\perl\bin\perl.exe B:\test1.pl
Вывод (сокращенный):
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}"]
Вас укусил тот факт, что Windows использует другую кодировку для текстовой среды (IBM850), чем для графической среды (Windows-1252).Эксперт должен объяснить более глубокие детали этого явления.
Редактировать:
Можно эвристически (то есть иногда не удастся сделать правильные вещи, особенно для таких коротких строк), определитькодировок.Наилучшим решением общего назначения является Encode :: Detect / Encode :: Detect :: Detector , основанное на Mozilla nsUniversalDetector .
Существует несколько способов декодирования внешнихданные неявно, такие как open
слои pragma / IO и -C
switch , однако они имеют дело только с файловыми потоками и аргументами программы.На данный момент из среды должны быть явно расшифрованы.В любом случае, мне это нравится больше, Explicite показывает программиста по сопровождению, о котором вы думали, что тема до