【问题标题】:Perl - Correcting char encoding on command line inputPerl - 更正命令行输入上的字符编码
【发布时间】: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 变量的方式运行?

【问题讨论】:

标签: perl utf-8 iso-8859-1


【解决方案1】:

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

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

【讨论】:

  • 感谢池上!这正是我所需要的。
【解决方案2】:

-CA 告诉 Perl 参数是 UTF-8 编码的。您可以自己从 UTF-8 解码参数:

unmangle(decode('UTF-8', $ARGV[0]));

另外,它不是“stdin”(从*STDIN 读取),而是“argument”。

【讨论】:

  • 更多挖掘(这里:stackoverflow.com/questions/6162484/…)告诉我,虽然我不能通过编译指示或其他内部代码调用 perl -CA,但我可以设置 ENV 变量 PERL_UNICODE='A',这将使程序按需要运行。
猜你喜欢
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
相关资源
最近更新 更多