perl5ever has asked for the wisdom of the Perl Monks concerning the following question:

Is it possible to dup and add an encoding layer to a file handle? Here's what I'm trying:
use strict; use warnings; my $x = "\x{42f}"."\n"; warn "printing to /tmp/foo\n"; open(my $fh, ">:utf8", "/tmp/foo") or die "open: $!"; print {$fh} $x; warn "printing to STDOUT\n"; print $x; warn "printing to duped STDOUT\n"; open(my $gh, ">&:utf8", \*STDOUT) or die "open: $!"; print {$gh} $x;
And here is the output under various run conditions (the Ҋ is a Cryillic capital "ya"):
$ LANG=C ./script printing to /tmp/foo printing to STDOUT Wide character in print at t5 line 13. Ҋ printing to duped STDOUT Ҋ $ LANG=en_US.UTF-8 ./script printing to /tmp/foo printing to STDOUT Ҋ printing to duped STDOUT Ҋ $ LANG=C ./script > /tmp/out printing to /tmp/foo printing to STDOUT Wide character in print at t5 line 13. printing to duped STDOUT Wide character in print at t5 line 18. $ LANG=en_US.UTF-8 ./script > /tmp/out printing to /tmp/foo printing to STDOUT printing to duped STDOUT Wide character in print at t5 line 18.
It seems that:
  1. The LANG setting affects the layers of STDOUT even if it is redirected to a file.
  2. My dup of STDOUT is not adding the utf8 layer
Is there a way I can dup a file handle and ensure that the utf8 I/O layer is present?

Btw, I'm using 5.8.0 - yes, very ancient.

Replies are listed 'Best First'.
Re: dup and add an encoding layer to a file handle?
by Anonymous Monk on Mar 13, 2009 at 07:11 UTC