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

标签 perl utf-8 iso-8859-1

我正在编写一个程序来修复损坏的编码,特别是 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 变量的方式运行?

最佳答案

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

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

关于Perl - 更正命令行输入上的字符编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70659708/

相关文章:

Vi 中的 UTF-8 支持

java - 编码困难

php - 将网站字符编码从 iso-8859-1 更改为 UTF-8

Perl PDL - 获取向量中 80% 的最低值

perl - perl 源代码中的 `use` 在哪里定义?

android - 使用volley-utf8发送数据

php mb_detect_encoding()

perl - 为什么 Perl 在我的 CGI 脚本中提示 "Use of uninitialized value"?

linux - 如何在同一文件中添加行数

Python 字符串,默认编码和解码(UTF-8?)