Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 解码用JSON.stringify编码的Mojolicious中的JSON字符串_Javascript_Json_Perl_Utf 8_Mojolicious - Fatal编程技术网

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

Javascript 解码用JSON.stringify编码的Mojolicious中的JSON字符串,javascript,json,perl,utf-8,mojolicious,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 wi

我试图将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
包含预期的数据

打印时会出现宽字符警告。这不是由于您如何解码unicode,而是由于您的标准输出编码。尝试使用CPAN提供的utf8::all,它会将所有IO句柄设置为utf8。避免解码可能不是解决问题,而是让问题变得更糟。它看起来有效的唯一原因是你的终端正在为你解决问题。

你至少可以通过摆脱有问题的角色来减轻一些痛苦;请参阅。

可以在以下位置找到魅力风格的解决方案:

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

您需要将
:utf8
流规程应用于Mojo::JSON从何处获取其参数值,但从我在CPAN的Mojo::JSON文档中看到的情况来看,它显然已经在这样做了。如果可以,请尝试从CPAN安装并使用JSON模块;我用它来解码utf8编码的JSON数据,效果很好。
$routes=JSON->new->utf8(0)->解码($self->param('routesjsonstr')你可以用Mojo::JSON,还是只用JSON.pm来实现这一点?很抱歉我之前的评论失败了:我让它与JSON.pm一起工作,并禁用了utf8。这似乎是可行的:
$routes=JSON->new->utf8(0)->解码($self->param('routes_jsonstr')。在启用utf8(1)的情况下,它会在/opt/mojo…
处的子例程条目中死,并出现错误
宽字符。我还在javascript中将$.get()替换为$.post(),但我认为这没有效果。哦,太棒了!介意我把评论转换成回答吗?谢谢。当使用您提供的链接中建议的自定义JSON_stringify函数时,我可以在perl端启用utf8解码:
$routes=JSON->new->utf8(1)->decode($self->param('routes_jsonstr')