如何让Perl尊重STDIN/STDOUT/STDERR的区域设置编码,而不影响文件IO?

如何让Perl尊重STDIN/STDOUT/STDERR的区域设置编码,而不影响文件IO?,perl,encoding,locale,Perl,Encoding,Locale,确保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,这不是很好的行为:您不希望文件的编码取决于您登录的方式。首先,您应该使用 use ope

确保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,这不是很好的行为:您不希望文件的编码取决于您登录的方式。

首先,您应该使用

use open ':std' => ':locale';
而不是

use open ':locale';

其次,应该为文本文件指定所需的编码

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


总而言之:

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


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

您希望在输出文件中使用什么编码?
use open ':std' => ':locale';
use open IO => ':encoding(UTF-8)';
open(my $fh, '>',     $qfn)   # Text
open(my $fh, '>:raw', $qfn)   # Binary
use open ':std' => ':locale';
open(my $fh, '>:encoding(UTF-8)', $qfn)   # Text
open(my $fh, '>:raw',             $qfn)   # Binary