鈍足ランナーのIT日記

走るのが好きな5流のITエンジニアのブログ。

趣味の範囲は広いけど、どれも中途半端なクソブロガー楽しめるWebアプリを作ってあっと言わせたい。サーバーサイドPerl(Mojolicious)、クライアントサイドVue.js。Arduinoにも触手を伸ばす予定。

Tengから取得した日本語文字列をMojoliciousでrender(partial)したあと、renderすると文字化けする

うーん。やっぱり文字化けしてしまった。

  • Tengから日本語文字列を取得する。
  • それをjsonデータとして、render(partial=>1)
  • それをスタッシュにつめる
  • renderでスタッシュの内容を出力
  my $json = $self->render(json=> \@routes, partial => 1);

  $self->app->log->debug($json);    #文字化けする
  print Dumper($json);              #文字化けしない

  $self->stash(route_json => $json);

  $self->render('search/index');  #文字化けする

デバッグ用に埋め込んだprint Dumperの方は文字化けしない。ログファイルに 出力した方および、$self->renderは文字化けする。

partial経由しないで、いきなり、renderでも文字化けしない。うーん。なぞは深まるばかり。。。

  $self->render(json=> \@routes);   #文字化けしない

perlの文字化けについて、自分で調べられるように、詳しくならないとだめだなぁ。 がくり。。

解決しました - 追記(2013/6/14)

render(partial)した結果は、いわゆるバイト文字列の世界になるので decodeしてあげて内部文字列に戻す必要があるのですね。 内部文字列に戻したあとに、スタッシュにセットしてあげればいいということですね。

use Encode 'decode';

...

  my $json = $self->render(json=> \@routes, partial => 1)->decode;

ふむふむ。render(partial)したときに、日本語が含まれる場合には、要注意ということでした。