昨日気付いた。
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 ✓ utf8
KossyはRouter::Boom使っているので、得られたテキストをdecodeするようにした