我正在尝试将javascript变量作为JSON字符串发送到Mojolicious,我在perl端解码时遇到问题。我的页面使用utf-8编码。
json字符串($self->param('routes_jsonstr')
的值)似乎具有正确的值,但Mojo::JSON
无法对其进行解码。当没有utf-8字符时,代码运行良好。我究竟做错了什么?
Javascript代码:
var routes = [ {
addr1: 'Škofja Loka', // string with utf-8 character
addr2: 'Kranj'
}];
var routes_jsonstr = JSON.stringify(routes);
$.get(url.on_route_change,
{
routes_jsonstr: routes_jsonstr
}
);
Perl代码:
sub on_route_change {
my $self = shift;
my $routes=j( $self->param('routes_jsonstr') );
warn $self->param('routes_jsonstr');
warn Dumper $routes;
}
服务器输出
Wide character in warn at /opt/mojo/routes/script/../lib/Routes/Homepage.pm line 76.
[{"addr1":"Škofja Loka","addr2":"Kranj"}] at /opt/mojo/routes/script/../lib/Routes/Homepage.pm line 76.
$VAR1 = undef;
上面的最后一行显示json字符串的解码不起作用。当在perl端没有要解码的utf-8字符时,一切正常,$routes
包含预期的数据。
答案 0 :(得分:3)
可以在这里找到Mojolicious样式解决方案: http://showmetheco.de/articles/2010/10/how-to-avoid-unicode-pitfalls-in-mojolicious.html
在Javascript中我只将$ .get()更改为$ .post()。 更新和工作的Perl代码现在看起来像这样:
use Mojo::ByteStream 'b';
sub on_route_change {
my $self = shift;
my $routes=j( b( $self->param('routes_jsonstr') )->encode('UTF-8') );
}
使用许多不同的utf8字符串进行测试。
答案 1 :(得分:1)
打印时会发生宽字符警告。这不是由于你如何解码你的unicode而是你的STDOUT编码。尝试CPAN提供的use utf8::all
,它会将所有IO句柄设置为utf8。避免解码可能不是解决问题,而是使问题变得更糟。它似乎工作的唯一原因是你的终端正在为你解决问题。
答案 2 :(得分:1)
你可以通过逃避有问题的角色来消除至少一些痛苦;见https://stackoverflow.com/a/4901205/17389。