解码用JSON.stringify编码的Mojolicious中的JSON字符串

时间:2013-04-30 14:40:26

标签: javascript json perl utf-8 mojolicious

我正在尝试将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包含预期的数据。

3 个答案:

答案 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