4

确保 Perl 对 STDIN/STDOUT/STDERR 使用区域设置编码(如 LANG=en_US.UTF-8)而不影响文件 IO 的最佳方法是什么?

如果我使用

use open ':locale';
say "mañana";
open (my $f, '>', 'test.txt'); say $f "mañana";

那么语言环境编码用于 STDIN/STDOUT/STDERR,但也在 test.txt 中,这不是很好的行为:你不希望文件的编码依赖于你登录的方式。

4

1 回答 1

4

要将编码层添加到 STDIN、STDOUT 和 STDERR,您需要使用

use open ':std', ':locale';

代替

use open ':locale';

但这不仅仅是为 STDIN、STDOUT 和 STDERR 添加了编码层;它会导致将相同的图层添加到默认情况下在范围内打开的文件句柄中。所以我们需要用

open(my $fh, '>:encoding(UTF-8)', $qfn)

或者

use open ':encoding(UTF-8)';
open(my $fh, '>', $qfn)

全部一起:

use open ':std', ':locale';
use open ':encoding(UTF-8)';
open(my $fh_txt, '>',     $qfn);   # Text
open(my $fh_bin, '>:raw', $qfn);   # Binary

或者

use open ':std', ':locale';
open(my $fh_txt, '>:encoding(UTF-8)', $qfn);   # Text
open(my $fh_bin, '>:raw',             $qfn);   # Binary

结果:

my $s = chr(0xE9);

say         $s;      # U+E9 encoded as per locale
say $fh_txt $s;      # U+E9 encoded using UTF-8
say $fh_bin $s;      # Byte E9

(如果您愿意,可以使用binmode($fh);而不是:raw二进制文件。)

于 2013-01-18T19:12:49.560 回答