PHPのjson_encode関数でマルチバイト文字がエスケープされる問題と解決方法

PHPのjson_encode関数でマルチバイト文字がエスケープされる問題と解決方法

PHPでJSONを扱う際に、json_encode() 関数を使うとマルチバイト文字が \uXXXX 形式にエスケープされてしまう ことがあります。この挙動を理解し、適切に対処する方法について解説します。

json_encode でマルチバイト文字がエスケープされる問題

通常、PHPの json_encode() 関数を使って日本語などのマルチバイト文字をエンコードすると、デフォルトの設定ではUnicodeエスケープ(\uXXXX)が適用されます。以下の例を見てみましょう。

1
php -r 'echo json_encode("あ");'

出力結果は次のようになります。

1
"\u3042"

このように、日本語の「あ」が \u3042 のようなUnicodeエスケープシーケンスに変換されてしまいます。

JSON_UNESCAPED_UNICODE を指定してエスケープを防ぐ

このエスケープを防ぎ、日本語文字をそのまま出力する ためには、json_encode() の第2引数に JSON_UNESCAPED_UNICODE を指定します。

1
php -r 'echo json_encode("あ", JSON_UNESCAPED_UNICODE);'

この場合の出力は以下のようになり、日本語のまま表示されます。

1
"あ"

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 をスロー

オプションはビットフラグとして組み合わせて指定できます。例えば、「日本語をエスケープせず、スラッシュもそのまま出力し、見やすい整形をする」 場合は、以下のように複数のオプションを組み合わせます。

1
2
3
$data = ["メッセージ" => "こんにちは", "URL" => "https://example.com"];
$json = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
echo $json;

出力結果:

1
2
3
4
{
    "メッセージ": "こんにちは",
    "URL": "https://example.com"
}

このように、オプションを適切に設定することで、用途に応じた最適なJSONエンコードが可能になります。

まとめ

PHPの json_encode() 関数を使用すると、デフォルトではマルチバイト文字が \uXXXX 形式にエスケープされてしまいます。これは、日本語を含むJSONデータを扱う際に可読性が低下する原因となります。

この問題を解決するには、json_encode() の第2引数に JSON_UNESCAPED_UNICODE を指定する ことで、エスケープを防ぎ、日本語をそのまま出力できます。

また、他にも JSON_PRETTY_PRINT や JSON_UNESCAPED_SLASHES など、様々なオプションが用意されているので、用途に応じて適切に活用しましょう。

参考

カテゴリ

comments powered by Disqus