2010-03-13 56 views
5

我有一個環境變量在Windows中設置爲TEST=abc£,它使用Windows-1252代碼頁。現在,當我運行Perl程序test.pl時,此環境值正常運行。如何在Perl中正確使用編碼爲Windows-1251的環境變量?

當我調用另一個Perl代碼 - test2.pltest1.pl無論是system(..)Win32::Process,環境來亂碼。

有人可以提供信息,爲什麼這可能是和解決辦法?

我使用的版本是perl是5.8。

如果我的理解是正確的,perl內部使用utf-8,因此初始過程 - 從test1.plWindows-1252utf-8收到它的權利。當我們調用另一個進程時,是否應該將其轉換回Windows-1252代碼頁?

+0

如果您提供演示問題的最簡單代碼,您將得到更快的答案。如果你只是用文字描述它,那麼想象力和困惑就剩下很多了。 – daxim 2010-03-13 12:43:29

+0

爲什麼在您提出的六個問題中您收到的十多個答案中沒有一個答案足以被接受? – 2010-03-13 14:25:06

+0

是的,我現在做了。 – Kartlee 2010-03-13 16:00:08

回答

8

這與Perl的內部字符串編碼無關,但需要正確解碼來自外部的數據。我會提供測試用例。這是西歐Windows XP上的Strawberry Perl 5.10。

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)的事實感到困惑。專家必須解釋這一現象的更深層次的細節。

編輯:

有可能試探性(這意味着它將無法做正確的事,有時,特別是對於這麼短的字符串)確定編碼。最好的通用解決方案是基於Mozilla nsUniversalDetectorEncode::Detect/Encode::Detect::Detector

有一些隱式解碼外部數據的方法,如open pragma/IO layers-C switch,但它們只處理文件流和程序參數。截至目前,從環境中必須明確解碼。無論如何,我更喜歡這個,明確表明維護程序員你認爲topic通過。

+0

感謝daxim的回覆。 幾個問題 - 1)是否可以確定什麼編碼用於來自外界的字符串?這將有助於在perl中進行相應的解碼。 2)有沒有辦法指示Perl在內部處理解碼部分,而不是我們自己確定外部世界中使用的編碼? -Kartlee – Kartlee 2010-03-13 15:35:28

+0

感謝您的提醒。我現在爲我認爲可以接受的做了。 – Kartlee 2010-03-13 15:59:46