Today I happend to read perldoc of Test::More and learned:
The Solution
Put this line before use Test::More
.
use open ':std', ':encoding(utf8)';
The Problem
use utf8; use strict; use warnings; use Test::More 'no_plan'; pass 'L( ◔ω◔)┘三└( ◔ω◔)」'; subtest 'foo' => sub { pass 'L( ◔ω◔)┘三└( ◔ω◔)」'; };
Wide character in print at /Users/motemen/.plenv/versions/5.14.2/lib/perl5/5.14.2/Test/Builder.pm line 1759. ok 1 - L( ◔ω◔)┘三└( ◔ω◔)」 Wide character in print at /Users/motemen/.plenv/versions/5.14.2/lib/perl5/5.14.2/Test/Builder.pm line 1759. ok 1 - L( ◔ω◔)┘三└( ◔ω◔)」 1..1 ok 2 - foo 1..2
The Explanation
use open ':std', ':encoding(utf8)'
adds encoding(utf8)
Perl IO layer to both STDOUT and STDERR (and STDIN),
which Test::Builder
duplicates to its output handles.
The following code will do the same:
BEGIN { binmode STDOUT, ':encoding(utf8)'; binmode STDERR, ':encoding(utf8)'; } use Test::More;