Perl - 更正命令行输入中的字符编码

Perl - Correcting char encoding on command line input

提问人:MERM 提问时间:1/11/2022 最后编辑:MERM 更新时间:1/11/2022 访问量:212

问:

我正在编写一个程序来修复损坏的编码,特别是拉丁语 1() 到希腊语 ()。iso-8859-1iso-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

PERL UTF-8 国际标准化组织 ISO-8859-1

评论

0赞 MERM 1/11/2022
做进一步的研究(这里: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 ÁöéÝñùìá
1赞 ikegami 1/11/2022
提示:(非标准编码)应为(标准编码)utf8utf-8

答:

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 -CAPERL_UNICODE='A'
2赞 ikegami 1/11/2022 #2

您解码了源。您解码了 STDIN(您不使用)、STDOUT 和 STDERR。但不是.@ARGV

$_ = decode("UTF-8", $_) for @ARGV;

评论

0赞 MERM 1/11/2022
谢谢池上!这正是我所需要的。