3

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

4

3 回答 3

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 字符串测试。

于 2013-05-01T08:13:06.033 回答
1

打印时会出现宽字符警告。这不是因为你如何解码你的 unicode,而是你的 STDOUT 编码。尝试use utf8::all从 CPAN 获得,它将所有 IO 句柄设置为 utf8。避免解码可能并不能解决问题,反而会使问题变得更糟。它似乎工作的唯一原因是您的终端正在为您解决问题。

于 2013-05-01T02:50:57.337 回答
1

通过逃避有问题的角色,您至少可以消除一些痛苦;请参阅https://stackoverflow.com/a/4901205/17389

于 2013-05-01T04:10:33.323 回答