gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:33:14 25 4
gpt4 key购买 nike

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

最佳答案

要将编码层添加到 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。)

关于perl - 如何让 Perl 尊重 STDIN/STDOUT/STDERR 的区域设置编码,而不影响文件 IO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14399629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com