PHP JSONで日本語を使う方法

  • ---

    LINEで送る
  • -

    ブックマーク
  • -

    pocket
  • -

    rss
イラスト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)

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

最近Webカテゴリでよく読まれている記事です。
blog image

ドメイン取得の意味が分からない人へ。王道の方法を紹介します。

ドメインの登録業者を選ぶのに悩む必要はないです。サイトを簡単に早く公開するには全くいらないことで、むしろ邪魔です。『お名前.com』というサービスは必ず耳にします。そのお名前.comのメリットとデメリットと一緒に、ドメインの意味が分からない人が一番失敗しないドメインの取得方法を紹介します。

tadtadya.com

_

SNSでも記事を配信しています。
コメントを残す

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

top
この記事を気に入ったらぜひシェアも!!