为什么 Perl 的编码层没有任何作用?

Rom*_*aka 4 perl character-encoding

我需要读取以 iso-8859-1 编码的文件。

出于某种原因,我无法使编码层(如 中所述PerlIO::encoding)工作。这是我正在做的一个最小的例子。

test.txt 包含以 iso-8859-1 编码的单个英镑符号。

% iconv -f iso-8859-1 test.txt
£

% hexdump -C test.txt
00000000  a3 0a                                             |..|
00000002
Run Code Online (Sandbox Code Playgroud)

我的 Perl 脚本:

#!/bin/perl

use warnings;
use strict;

open my $f, "<:encoding(iso-8859-1)", $ARGV[0] or die qq{Could not open $ARGV[0]: $!};

while (<$f>) {
  print;
}
Run Code Online (Sandbox Code Playgroud)

结果:

% ./script.pl test.txt | hexdump -C
00000000  a3 0a                                             |..|
00000002
Run Code Online (Sandbox Code Playgroud)

所以脚本打印它读取的确切字节序列,不执行任何转换。

Rom*_*aka 5

我假设未使用特定编码声明的文件句柄默认使用 utf-8 编码,但显然这不是真的。

添加显式

binmode(STDOUT, ":utf8");
Run Code Online (Sandbox Code Playgroud)

解决问题。