2019/07/10更新

[PHP] json_encode()で、日本語をUnicodeエスケープ(\uXXXX)させない方法

このエントリーをはてなブックマークに追加            

こんにちは、@yoheiMuneです。
今日は、PHPの配列をJSON文字列にする時に使うjson_encode()関数について、日本語などのマルチバイト文字をエスケープさせない方法を、ブログに書きます。



目次




何が問題か

json_encode()を普通に実行すると、日本語がユニコードでエスケープ(\uXXXX)されます。
$data = [ "message" => "こんにちは" ];
json_encode($data);

// 出力:{"message":"\u3053\u3093\u306b\u3061\u306f"}
\u3053\u3093\u306b\u3061\u306fの部分がUnicodeエスケープですが、これをさせたくない場合にどうしたら良いか、を解決したいと思います。

なお、PHPを気軽に実行したい場合、オンラインエディタ(Online PHP Editor)が便利です。無料で利用できます。



ユニコードエスケープさせないオプション

Unicodeエスケープさせないようにするには、JSON_UNESCAPED_UNICODEオプションを指定して、json_encode()を実行します。
$data = [ "message" => "こんにちは" ];
json_encode($data, JSON_UNESCAPED_UNICODE);    

// 出力:{"message":"こんにちは"}
これで無事に日本語がそのまま表示されました。

他にも便利なオプションがあるので、次の章で紹介したいと思います。



そのほかのオプション

JSON_UNESCAPED_UNICODE以外にも、オプションがいくつか存在します。その中で、使う場面があるものを紹介したいと思います。

< と > をエスケープする

JSON_HEX_TAGオプションを使うと、< と > をエスケープして、出力できます。
// < と > をエスケープする.
$data = [ "message" => "<p>hello</p>" ];
json_encode($data, JSON_HEX_TAG);  // {"message":"\u003Cp\u003Ehello\u003C\/p\u003E"}

「/(スラッシュ)」をエスケープさせない

「/(スラッシュ)」は通常エスケープされますが、JSON_UNESCAPED_SLASHESを使うと、スラッシュのエスケープを抑止できます。
// 「/(スラッシュ)」をエスケープしない(未指定の場合、「/」は「\/」とエスケープされます).
$data = [ "url" => "https://www.yoheim.net" ];
json_encode($data, JSON_UNESCAPED_SLASHES);  // {"url":"https://www.yoheim.net"}

その他のオプション

ここで紹介したオプション以外にもオプションがあります・オプションの一覧は「PHPマニュアル - 定義済み定数」をご参照ください。

複数のオプションを同時に使う

複数のオプションを同時に指定したい場合、オプションを「|(パイプ)」で繋げます。
// 2つのオプションを同時に指定する場合「|(パイプ)」を使う.
$data = [ "message" => "

こんにちは

" ]; json_encode($data, JSON_HEX_TAG | JSON_UNESCAPED_UNICODE); // 出力例:{"message":"\u003Cp\u003Eこんにちは\u003C\/p\u003E"}
この辺りまで自由に使えるようになると、かなり実装力が高めだと思いです。



合わせて読みたい

PHPについて、下記の記事も参考になれば幸いです。もし良ければご覧ください。

ログ出力等する際に、日付文字列をミリ秒まで表示する方法

[PHP] PHPBrewで複数のバージョンを使い分ける



最後に

今回はログ出力時に、JSON文字列でエスケープさせたくないと思い、調べて試して、無事に解決できました。トライ&エラーで得た知見をブログに書き、誰かの役に立てれば幸いです。

最後になりますが本ブログでは、Python、フロントエンド、インフラ、サーバー、PHP、Swift、Node.js、Java、Linux、機械学習、などの技術トピックを発信をしていきます。「プログラミングで困ったその時の、解決の糸口に!」そんな目標でブログを書き続けています。ぜひ、本ブログのRSSTwitterをフォローして貰えたら嬉しいです ^ ^

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。