4

ファイル IO に影響を与えずに、Perl が STDIN/STDOUT/STDERR にロケールエンコーディング (LANG=en_US.UTF-8 のように) を使用するようにする最善の方法は何ですか?

私が使用する場合

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 に答える