
PHPのjson_encode関数でマルチバイト文字がエスケープされる問題と解決方法
PHPでJSONを扱う際に、json_encode() 関数を使うとマルチバイト文字が \uXXXX 形式にエスケープされてしまう ことがあります。この挙動を理解し、適切に対処する方法について解説します。
json_encode でマルチバイト文字がエスケープされる問題
通常、PHPの json_encode() 関数を使って日本語などのマルチバイト文字をエンコードすると、デフォルトの設定ではUnicodeエスケープ(\uXXXX)が適用されます。以下の例を見てみましょう。
|
|
出力結果は次のようになります。
|
|
このように、日本語の「あ」が \u3042 のようなUnicodeエスケープシーケンスに変換されてしまいます。
JSON_UNESCAPED_UNICODE を指定してエスケープを防ぐ
このエスケープを防ぎ、日本語文字をそのまま出力する ためには、json_encode() の第2引数に JSON_UNESCAPED_UNICODE を指定します。
|
|
この場合の出力は以下のようになり、日本語のまま表示されます。
|
|
JSON_UNESCAPED_UNICODE を指定することで、JSON文字列内でマルチバイト文字がエスケープされるのを防ぐことができます。
json_encode の第2引数に指定できるオプション一覧
PHPの json_encode() では、第2引数にさまざまなオプションを指定できます。主なオプションを以下に紹介します。
オプション | 値 | 説明 |
---|---|---|
JSON_PRETTY_PRINT |
128 |
JSONの出力を整形(インデント付き) |
JSON_UNESCAPED_UNICODE |
256 |
マルチバイト文字を \uXXXX にエスケープせずにそのまま出力 |
JSON_UNESCAPED_SLASHES |
64 |
スラッシュ / を \/ にエスケープせずにそのまま出力 |
JSON_HEX_TAG |
1 |
< と > を \u003C \u003E にエスケープ |
JSON_HEX_AMP |
2 |
& を \u0026 にエスケープ |
JSON_HEX_APOS |
4 |
' (シングルクォート)を \u0027 にエスケープ |
JSON_HEX_QUOT |
8 |
" (ダブルクォート)を \u0022 にエスケープ |
JSON_FORCE_OBJECT |
16 |
配列を強制的にオブジェクトとしてエンコード |
JSON_THROW_ON_ERROR |
4194304 |
エンコードエラー時に JsonException をスロー |
オプションはビットフラグとして組み合わせて指定できます。例えば、「日本語をエスケープせず、スラッシュもそのまま出力し、見やすい整形をする」 場合は、以下のように複数のオプションを組み合わせます。
|
|
出力結果:
|
|
このように、オプションを適切に設定することで、用途に応じた最適なJSONエンコードが可能になります。
まとめ
PHPの json_encode() 関数を使用すると、デフォルトではマルチバイト文字が \uXXXX 形式にエスケープされてしまいます。これは、日本語を含むJSONデータを扱う際に可読性が低下する原因となります。
この問題を解決するには、json_encode() の第2引数に JSON_UNESCAPED_UNICODE を指定する ことで、エスケープを防ぎ、日本語をそのまま出力できます。
また、他にも JSON_PRETTY_PRINT や JSON_UNESCAPED_SLASHES など、様々なオプションが用意されているので、用途に応じて適切に活用しましょう。