Как правильно использовать переменные среды, закодированные как Perl в Windows-1251? - PullRequest
6 голосов
/ 13 марта 2010

У меня есть переменная окружения, установленная в Windows как TEST=abc£, которая использует кодовую страницу Windows-1252. Теперь, когда я запускаю Perl-программу test.pl, это значение среды появляется правильно.

Когда я вызываю другой код Perl - test2.pl из test1.pl или system(..) или Win32::Process, среда искажается.

Может ли кто-нибудь предоставить информацию, почему это может быть и способ ее решения?

Используемая версия perl - 5.8.

Если мое понимание верно, perl внутренне использует utf-8, поэтому начальный процесс - test1.pl получил его прямо от Windows-1252 & rarr; utf-8. Когда мы вызываем другой процесс, мы должны преобразовать обратно в Windows-1252 кодовую страницу?

1 Ответ

9 голосов
/ 13 марта 2010

Это не имеет ничего общего с внутренним строковым кодированием 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 показывает программиста по сопровождению, о котором вы думали, что тема до

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...