Я пытаюсь отправить переменную 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
}
);
Перл-код:
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
содержит ожидаемые данные.
:utf8
к тому месту, откуда Mojo::JSON получает свои значения параметров, но, судя по тому, что я вижу в документации Mojo::JSON на CPAN, очевидно, что он уже должен это делать. Если можете, попробуйте установить и использовать модуль JSON из CPAN; У меня были хорошие результаты, используя это для декодирования данных JSON в кодировке utf8. - person Aaron Miller   schedule 30.04.2013$routes=JSON->new->utf8(0)->decode( $self->param('routes_jsonstr') );
. При включенном utf8(1) он умирает с ошибкойWide character in subroutine entry at /opt/mojo...
. Я также заменил $.get() на $.post() в javascript, но я думаю, что это не имеет никакого эффекта. - person Miha Lampret   schedule 30.04.2013