Edited at

MojoliciousのJSON出力で文字化け

More than 5 years have passed since last update.

MojoliciousでJSON-APIを作るのは普通に行うと思いますが、

JSON文字列をHTML内に出力するというケースもあるでしょう。

そんな時に、文字化けに遭遇したのでご紹介します。

下記サンプルコードを見てください。

package MojibakeApp::Example;

use Mojo::Base 'Mojolicious::Controller';
use Encode 'decode';

# This action will render a template
sub welcome {
my $self = shift;

my $moji = {hello => "文字化け"};
my $json = $self->render(
json => $moji , partial => 1);

$self->app->log->debug($json);
print Dumper($json);

$self->render(
message => $json);

% layout 'default';

% title 'Welcome';
<script>var hoge= <%= $message %>
</script>

この文字化けに遭遇したときは、原因が最初よくわかりませんでしたが、

ログ出力でその原因がわかりました。

Mojoliciousのログファイルは文字化けしていたのですが、

ターミナルに出力したprintの出力結果が文字化けしていなかったのです。

そうです。render(partial)した結果がバイト列になっているのです。

下記のようにdecodeで一旦、テキスト文字列に引き戻してやることで

文字化けを回避することができました。

my $json = $self->render(

json => $moji , partial => 1)->decode;

小ネタではありますが、筆をおきます。

書いていてこれはMojoliciousのバグなのでは?!

とも思うようになってきて若干不安です。

さて、次回はazumakuniyukiさんということで、期待高まります。

よろしくお願いします。