提问人:MERM 提问时间:1/11/2022 最后编辑:MERM 更新时间:1/11/2022 访问量:212
Perl - 更正命令行输入中的字符编码
Perl - Correcting char encoding on command line input
问:
我正在编写一个程序来修复损坏的编码,特别是拉丁语 1() 到希腊语 ()。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]);
当我使用与我的变量相同的输入运行此程序时,reults 并不相同(正如我预期的那样):$test
$ ./fix_bad_encoding.pl "ÁöéÝñùìá"
fix variable:
ÁöéÝñùìá
Αφιέρωμα
fix stdin:
ÃöéÃñùìá
ΓΓΆΓ©ΓñùìÑ
我如何获得变量的行为方式?$ARGV[0]
$test
答:
1赞
choroba
1/11/2022
#1
-CA
告诉 Perl 参数是 UTF-8 编码的。您可以自己从 UTF-8 解码参数:
unmangle(decode('UTF-8', $ARGV[0]));
此外,它不是“stdin”(这将是从 ),而是“argument”。*STDIN
评论
0赞
MERM
1/11/2022
更多的挖掘(这里:stackoverflow.com/questions/6162484/...)告诉我,虽然我不能通过编译指示或其他内部代码调用,但我可以设置 ENV 变量,这将使程序按预期运行。perl -CA
PERL_UNICODE='A'
2赞
ikegami
1/11/2022
#2
您解码了源。您解码了 STDIN(您不使用)、STDOUT 和 STDERR。但不是.@ARGV
$_ = decode("UTF-8", $_) for @ARGV;
评论
0赞
MERM
1/11/2022
谢谢池上!这正是我所需要的。
评论
-CA
$ARGV[0]
perl -CA ./fix_bad_encoding.pl ÁöéÝñùìá
utf8
utf-8