json_encode()を使ってPHPの配列やオブジェクトをjsonに変換しますが、UTF-8などのUnicodeの場合、json結果の日本語がUnicodeのままになります。
それを、日本語で表示するようにします。
かんたんです。説明は3分もかかりません。
まずは、PHPの配列やオブジェクトをjsonに変換します。使っている文字コードはUTF-8です。
$array = ['english' => 'hello', '日本語' => 'こんにちわ'];
echo json_encode($array);
結果です。
{"english":"hello","\u65e5\u672c\u8a9e":"\u3053\u3093\u306b\u3061\u308f"}
"\u????"はUTF-8のコードです。文字化けではないことに注意。
文字化けは期待する文字コード以外で変換したときに起きます。ここではUTF-8のコード文字列そのものが表示されています。
jsonを受け取る側でUTF-8のコード変換をすればそれでいいのですが、Webサイトの場合はめんどうで、ムダなJavaScriptの処理が増えてしまいます。
json_encode()実行時に、日本語に変換してあげます。
かんたんです。オプションを追加するだけ。
$array = ['english' => 'hello', '日本語' => 'こんにちわ'];
echo json_encode($array, JSON_UNESCAPED_UNICODE);
結果です。
{"english":"hello","日本語":"こんにちわ"}
これだけ。
"JSON_UNESCAPED_UNICODE"はスペルのとおりです。
json_encode()では、UTF-8などのUnicodeはデフォルトでエスケープされているんですね?
エスケープ処理(escape)
マークアップ言語やプログラムで文字列をあつかうときに、特別な意味をもつ文字列を別の文字列に変換すること。
たとえばHTMLの"<", ">"はタグに使われるので、Webで表示するときはエスケープされる。
HTMLの例
特殊文字 | エスケープ文字 |
---|---|
< | < |
> | > |
正確には、
Unicode(UTF-8)の変換。
ではなく、
エスケープをしないでそのままjsonに格納する。
これを覚えておけばいいです。
json_encode()は、デフォルトでUnicodeをエスケープする。
UTF-8のマルチバイト文字(日本語など)は、エスケープするときに文字コードそのものに変換される。
シングルバイト文字(半角英数や一部の記号)はエスケープされない。
ちなみに、エスケープしないときに、jsonの特殊文字であるダブルクォーテーション(")はどうなるか、気になると思います。
大丈夫です。ダブルクォーテーションだけはエスケープされます。
$array = ['english' => 'hello', '日本語' => 'こんにちわ', 'quote-single' => "'single'", 'quote-double' => '"double"'];
echo json_encode($array);
echo json_encode($array, JSON_UNESCAPED_UNICODE);
{"english":"hello","\u65e5\u672c\u8a9e":"\u3053\u3093\u306b\u3061\u308f","quote-single":"'single'","quote-double":"\"double\""}
{"english":"hello","日本語":"こんにちわ","quote-single":"'single'","quote-double":"\"double\""}
ついでにシングルクォーテーションもどうなるか入れてみました。
シングルクォーテーションは特殊文字じゃないのでそのまま。ダブルクォーテーションはエスケープされて『\"』になっています。
jsonではエスケープされた特殊文字は『\』が頭につきます。Unicodeにもついてますよね?
『u』はアルファベット小文字じゃなくて、UTF-8のコードで使う特殊文字。
サーバーサイドでUTF-8を使っていても、フロントサイドがどの文字コードを使っているのかはわかりません。
(WindowsはShift+JIS。)
(フロントサイドは、iPhone, Androidスマホ, タブレット, Windows PC, Mac PC, Webブラウザなど)
jsonは通信データのフォーマットとして使われるので、デフォルトでエスケープされます。
フロントがどのような状態でも、サーバーとしては通信データに同じものを使いたいから。
日本語を表示する仕事をフロントサイドに任せているんですね?
jsonからPHPの配列、オブジェクトに変換するjson_decode()のオプションには、"JSON_UNESCAPED_UNICODE"はありません。
せいぜい値をフロントに返すか、データベースにつっ込むだけなので意味がないからです。
終わりです。
エンコードとデコード
エンコード(encode)
通信データなどをある規則にしたがって符号化する。
デコード(decode)
エンコード(符号化)されたデータを復元する。