Javascript 解码用JSON.stringify编码的Mojolicious中的JSON字符串
我试图将javascript变量作为JSON字符串发送给Mojolicious,但在perl端解码时遇到问题。我的页面使用utf-8编码 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
$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')代码>