這與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 nsUniversalDetector的Encode::Detect/Encode::Detect::Detector。
有一些隱式解碼外部數據的方法,如open
pragma/IO layers和-C
switch,但它們只處理文件流和程序參數。截至目前,從環境中必須明確解碼。無論如何,我更喜歡這個,明確表明維護程序員你認爲topic通過。
如果您提供演示問題的最簡單代碼,您將得到更快的答案。如果你只是用文字描述它,那麼想象力和困惑就剩下很多了。 – daxim 2010-03-13 12:43:29
爲什麼在您提出的六個問題中您收到的十多個答案中沒有一個答案足以被接受? – 2010-03-13 14:25:06
是的,我現在做了。 – Kartlee 2010-03-13 16:00:08