From: Brian Cassidy Date: Wed, 16 Jan 2008 12:36:28 +0000 (+0000) Subject: fix uri_for()'s handling of multibyte chars (Daisuke Murase) X-Git-Tag: 5.7099_04~96 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=commitdiff_plain;h=0ce485e9e71b37bbe5a35d09f795535e9e231394 fix uri_for()'s handling of multibyte chars (Daisuke Murase) --- diff --git a/Changes b/Changes index 479ba64..13dec6b 100644 --- a/Changes +++ b/Changes @@ -1,6 +1,7 @@ # This file documents the revision history for Perl extension Catalyst. 5.7012 2007-12-16 23:44:00 + - Fix uri_for()'s handling of multibyte chars (Daisuke Murase) - Fix __PACKAGE__->config->{foo} = 'bar' case with subclassing - Add Catalyst::Stats (Jon Schutz) - Fixed a bug where ?q=bar=baz is decoded as q=>'bar', not 'bar=baz'. diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index 96ad9a5..bfe50dd 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -978,7 +978,7 @@ sub uri_for { $val = '' unless defined $val; (map { $_ = "$_"; - utf8::encode( $_ ); + utf8::encode( $_ ) if utf8::is_utf8($_); # using the URI::Escape pattern here so utf8 chars survive s/([^A-Za-z0-9\-_.!~*'() ])/$URI::Escape::escapes{$1}/go; s/ /+/g; diff --git a/t/unit_core_uri_for_multibytechar.t b/t/unit_core_uri_for_multibytechar.t new file mode 100644 index 0000000..0a569d6 --- /dev/null +++ b/t/unit_core_uri_for_multibytechar.t @@ -0,0 +1,37 @@ +use strict; +use warnings; + +use FindBin; +use File::Spec; +use lib File::Spec->catfile($FindBin::Bin, 'lib'); + +use Test::More; + +plan tests => 3; + +use_ok('TestApp'); + +my $base = 'http://127.0.0.1'; + +my $request = Catalyst::Request->new({ + base => URI->new($base), +}); + +my $context = TestApp->new({ + request => $request, +}); + + +my $uri_with_multibyte = URI->new($base); +$uri_with_multibyte->path('/'); +$uri_with_multibyte->query_form( + name => '村瀬大輔', +); + + +# multibyte with utf8 bytes +is($context->uri_for('/', { name => '村瀬大輔' }), $uri_with_multibyte, 'uri with utf8 bytes query'); + + +# multibyte with utf8 string +is($context->uri_for('/', { name => "\x{6751}\x{702c}\x{5927}\x{8f14}" }), $uri_with_multibyte, 'uri with utf8 string query');