据我所知,perl
解释器不会自动解码终端的命令行参数。这意味着,如果它们包含宽字符,那么应该像这样处理它们:
#!/usr/bin/env perl
use I18N::Langinfo qw(langinfo CODESET);
use Encode qw(decode);
use Data::Dumper;
binmode STDOUT, ':utf8';
my $codeset = langinfo(CODESET); # returns 'UTF-8'
print Dumper \@ARGV;
foreach my $arg (@ARGV) {
push @new_ARGV, decode $codeset, $arg;
}
# Now, the strings inside @new_ARGV are in valid internal format
print Dumper \@new_ARGV;
上面的脚本给出了如下结果(终端和语言环境设置为UTF-8
):
$ perl AC_351.pl śóą
$VAR1 = [
'ÅóÄ'
];
$VAR1 = [
"\x{15b}\x{f3}\x{105}"
];
我是否应该总是解码这样的命令行参数,或者是否有一些设置或开关告诉Perl自己处理这个?