http://qs321.pair.com?node_id=699327


in reply to How can I enable utf8 layer on Test::More diag output

Instead of calling diag($data) you probably have to do this:
my $tb = Test::More->builder; $tb->failure_output(\*STDOUT); $tb->diag($data);
Of course you can wrap it in a subroutine.

Update: Alternatively, instead of redefining failure_output, it might be better to just call binmode on it:

my $tb = Test::More->builder; binmode $tb->failure_output, ":utf8"; $tb->diag(...);

Replies are listed 'Best First'.
Re^2: How can I enable utf8 layer on Test::More diag output
by mje (Curate) on Jul 22, 2008 at 14:57 UTC
    This does in deed work and I've found out why. The problem is that Test::Builder duplicates STDOUT and STDERR (comments say so you can change them without affecting Test::More) but it does NOT duplicate the IO layers. The funny thing is has code to do it but it is commented out:
    sub _open_testhandles { my $self = shift; return if $Opened_Testhandles; # We dup STDOUT and STDERR so people can change them in their # test suites while still getting normal test output. open( $Testout, ">&STDOUT") or die "Can't dup STDOUT: $!"; open( $Testerr, ">&STDERR") or die "Can't dup STDERR: $!"; # $self->_copy_io_layers( \*STDOUT, $Testout ); # $self->_copy_io_layers( \*STDERR, $Testerr ); $Opened_Testhandles = 1; } sub _copy_io_layers { my($self, $src, $dst) = @_; $self->_try(sub { require PerlIO; my @src_layers = PerlIO::get_layers($src); binmode $dst, join " ", map ":$_", @src_layers if @src_layers; }); }
    I've no idea why this is commented out. However, setting utf8 io layer on STDOUT and then calling failure_output to reset Test::More's idea of failure output works - just seems a bit of a hack.