エンコーディングレイヤーを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