Perl - 更正命令行输入的字符编码
Perl - Correcting char encoding on command line input
我正在编写一个程序来修复损坏的编码,特别是 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 = "ÁöéÝñùìá"; # should be Αφιέρωμα
say "fix variable:";
unmangle($test);
say "\nfix argument:";
unmangle($ARGV[0]);
当我 运行 这个程序使用与我的 $test
变量相同的输入时,结果不一样(正如我预期的那样):
$ ./fix_bad_encoding.pl "ÁöéÝñùìá"
fix variable:
ÁöéÝñùìá
Αφιέρωμα
fix stdin:
ÃöéÃñùìá
ΓΓΆΓ©ΓñùìÑ
如何让 $ARGV[0]
以 $test
变量的方式运行?
-CA
告诉 Perl 参数是 UTF-8 编码的。您可以自己从 UTF-8 解码参数:
unmangle(decode('UTF-8', $ARGV[0]));
此外,它不是“标准输入”(从 *STDIN
读取),而是“参数”。
您解码了源代码。您解码了 STDIN(您不使用)、STDOUT 和 STDERR。但不是 @ARGV
.
$_ = decode("UTF-8", $_) for @ARGV;
我正在编写一个程序来修复损坏的编码,特别是 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 = "ÁöéÝñùìá"; # should be Αφιέρωμα
say "fix variable:";
unmangle($test);
say "\nfix argument:";
unmangle($ARGV[0]);
当我 运行 这个程序使用与我的 $test
变量相同的输入时,结果不一样(正如我预期的那样):
$ ./fix_bad_encoding.pl "ÁöéÝñùìá"
fix variable:
ÁöéÝñùìá
Αφιέρωμα
fix stdin:
ÃöéÃñùìá
ΓΓΆΓ©ΓñùìÑ
如何让 $ARGV[0]
以 $test
变量的方式运行?
-CA
告诉 Perl 参数是 UTF-8 编码的。您可以自己从 UTF-8 解码参数:
unmangle(decode('UTF-8', $ARGV[0]));
此外,它不是“标准输入”(从 *STDIN
读取),而是“参数”。
您解码了源代码。您解码了 STDIN(您不使用)、STDOUT 和 STDERR。但不是 @ARGV
.
$_ = decode("UTF-8", $_) for @ARGV;