2013-04-30 1 views
2

Я пытаюсь отправить переменную javascript как строку JSON в Mojolicious, и у меня возникают проблемы с расшифровкой ее на Perl-стороне. Моя страница использует кодировку utf-8.Декодировать строку JSON в Mojolicious, которая была закодирована с помощью JSON.stringify

Строка 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 строки не работает. Когда нет utf-8 символов для декодирования на Perl-стороне, все работает нормально, а $routes содержит ожидаемые данные.

+0

Вам нужно будет применить дисциплину потока: utf8, где Mojo :: JSON получает свои значения параметров, но из того, что я вижу в документации Mojo :: JSON на CPAN, должно быть, должно быть, что. Если можно, попробуйте установить и использовать модуль JSON из CPAN; У меня были хорошие результаты с использованием для декодирования данных JSON, закодированных в utf8. –

+0

'$ routes = JSON-> new-> utf8 (0) -> decode ($ self-> param ('routes_jsonstr'));' –

+0

Можете ли вы сделать это с Mojo :: JSON или только с JSON.pm? –

ответ

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

Предупреждения о широких знаках возникают при печати. Это происходит не из-за того, как вы декодируете ваш юникод, а в свою кодировку STDOUT. Попробуйте use utf8::all, доступный от CPAN, который установит все ваши ручки ввода-вывода в utf8. Избежание расшифровки, вероятно, не устраняет проблему, а делает ее еще хуже. Единственная причина, по которой он работает, - ваш терминал исправляет все для вас.

1

Вы можете убрать хотя бы часть боли, избегая проблемных персонажей; см. https://stackoverflow.com/a/4901205/17389.

+0

Спасибо. При использовании пользовательской функции JSON_stringify, как предлагается в приведенной ссылке, я могу включить декодирование utf8 на Perl-стороне: '$ routes = JSON-> new-> utf8 (1) -> decode ($ self-> param ('routes_jsonstr')); ' –

 Смежные вопросы

  • Нет связанных вопросов^_^