我正在撰寫一個程式來修復損壞的編碼,特別是 latin1( iso-8859-1) 到希臘語 ( iso-8859-7)。
我創建了一個按預期作業的函式;具有錯誤編碼文本的變數被正確轉換。
當我嘗試$ARGV[0]使用此函式進行轉換時,它似乎無法正確解釋輸入。
這是一個演示該問題的測驗程式:
#!/usr/bin/env perl
use 5.018;
use utf8;
use strict;
use open qw(:std :encoding(utf-8));
use Encode qw(encode decode);
sub unmangle {
my $input = shift;
print $input . "\n";
print decode('iso-8859-7', encode('latin1',$input)) . "\n";
}
my $test = "á?éY?ùìá"; # should be Αφι?ρωμα
say "fix variable:";
unmangle($test);
say "\nfix argument:";
unmangle($ARGV[0]);
當我使用與$test變數相同的輸入運行此程式時,結果不一樣(正如我預期的那樣):
$ ./fix_bad_encoding.pl "á?éY?ùìá"
fix variable:
á?éY?ùìá
Αφι?ρωμα
fix stdin:
???????±?1????
ΓΓ?Γ?ΓΓ±Γ?Γ?Γ‘
我如何$ARGV[0]表現出$test變數的行為方式?
uj5u.com熱心網友回復:
你解碼了源代碼。您解碼了 STDIN(您不使用)、STDOUT 和 STDERR。但不是@ARGV。
$_ = decode("UTF-8", $_) for @ARGV;
uj5u.com熱心網友回復:
-CA告訴 Perl 引數是 UTF-8 編碼的。您可以自己解碼來自 UTF-8 的引數:
unmangle(decode('UTF-8', $ARGV[0]));
此外,它不是“stdin”(將從 讀取*STDIN),而是“argument”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/409717.html
標籤:
