ツイート
シェア
LINEで送る
B! はてぶでブックマーク
Pocketでブックマーク
RSSフィード

PHP, JSONで日本語を使う方法。Unicodeのエスケープを辞めればOK。

php
イラストダウンロードサイト【イラストAC】
の画像をもとに加工しています。

json_encode()を使ってPHPの配列やオブジェクトをjsonに変換しますが、UTF-8などのUnicodeの場合、json結果の日本語がUnicodeのままになります。

それを、日本語で表示するようにします。

かんたんです。説明は3分もかかりません。

まずは、PHPの配列やオブジェクトをjsonに変換します。使っている文字コードはUTF-8です。

json_encode()
$array = ['english' => 'hello', '日本語' => 'こんにちわ'];
echo json_encode($array);

結果です。

result
{"english":"hello","\u65e5\u672c\u8a9e":"\u3053\u3093\u306b\u3061\u308f"}

"\u????"はUTF-8のコードです。文字化けではないことに注意。

文字化けは期待する文字コード以外で変換したときに起きます。ここではUTF-8のコード文字列そのものが表示されています。

jsonを受け取る側でUTF-8のコード変換をすればそれでいいのですが、Webサイトの場合はめんどうで、ムダなJavaScriptの処理が増えてしまいます。

json_encode()実行時に、日本語に変換してあげます。

かんたんです。オプションを追加するだけ。

json_encode()のUnicode変換
$array = ['english' => 'hello', '日本語' => 'こんにちわ'];
echo json_encode($array, JSON_UNESCAPED_UNICODE);

結果です。

result
{"english":"hello","日本語":"こんにちわ"}

これだけ。

"JSON_UNESCAPED_UNICODE"はスペルのとおりです。

json_encode()では、UTF-8などのUnicodeはデフォルトでエスケープされているんですね?

エスケープ処理(escape)

マークアップ言語やプログラムで文字列をあつかうときに、特別な意味をもつ文字列を別の文字列に変換すること。

たとえばHTMLの"<", ">"はタグに使われるので、Webで表示するときはエスケープされる。

HTMLの例

特殊文字エスケープ文字
<&lt;
>&gt;

-> 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);
result1
{"english":"hello","\u65e5\u672c\u8a9e":"\u3053\u3093\u306b\u3061\u308f","quote-single":"'single'","quote-double":"\"double\""}
result2
{"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)

エンコード(符号化)されたデータを復元する。

前の投稿
PHP, HTMLのテンプレートを作る方法。テンプレートファイルを読んでHTMLを作る。
PHP, パスワードのハッシュはpassword_hash()を使おう!
次の投稿
コメントを残す

*