【发布时间】:2022-01-10 22:43:55
【问题描述】:
我正在编写一个程序来修复损坏的编码,特别是 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 变量的方式运行?
【问题讨论】:
-
做进一步的研究(这里:stackoverflow.com/questions/9730835/… 和这里:perldoc.perl.org/perlrun#%2a-C-%5b_number%2flist_%5d%2a)告诉我,通过在 perl 中添加
-CA标志,我可以得到$ARGV[0]的行为。现在我要做的就是弄清楚如何从我的程序中调用这个选项,而不是perl -CA ./fix_bad_encoding.pl ÁöéÝñùìá -
提示:
utf8(非标准编码)应为utf-8(标准编码)
标签: perl utf-8 iso-8859-1