昨日気付いた。
Router::Simpleはいわゆるutf8 flaggedな内部文字列を渡すと、キャプチャしたテキストも内部文字列として得られるけど、Router::Boomはバイナリ列となる。
use Router::Boom; use Router::Simple; use Encode; use Test::More; use utf8; subtest 'boom' => sub { my $path = '/foobarです'; my $router = Router::Boom->new(); $router->add('/:user', 'dispatch_user'); my @args = $router->match($path); is $args[1]->{user}, 'foobarです', 'match'; ok Encode::is_utf8($args[1]->{user}),'utf8'; }; subtest 'simple' => sub { my $path = '/foobarです'; my $router = Router::Simple->new(); $router->connect('/:user', {action=>'dispatch_user'}); my $args = $router->match($path); is $args->{user}, 'foobarです', 'match'; ok Encode::is_utf8($args->{user}),'utf8'; }; done_testing;
結果
% perl -MTest::Pretty ./boom.pl
boom
✖ match
# Failed test 'match'
# at /path/to/boom.pl line 12.
# got: 'foobarã§ã'
# expected: 'foobarです'
✖ utf8
# Failed test 'utf8'
# at /path/to/boom.pl line 13.
simple
✓ match
✓ utf8KossyはRouter::Boom使っているので、得られたテキストをdecodeするようにした