【PHP8.x】JSON_UNESCAPED_UNICODE定数の使い方
JSON_UNESCAPED_UNICODE定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
JSON_UNESCAPED_UNICODE定数は、PHPのjson_encode()関数でJSON文字列を生成する際に、Unicode文字のエスケープ処理を制御するための定数です。通常、json_encode()関数は、日本語の文字のようなASCII文字以外のUnicode文字を、\uXXXXという形式のエスケープシーケンスに変換して出力します。これは、多様なシステム間での互換性を保証するための標準的な動作です。
このJSON_UNESCAPED_UNICODE定数をjson_encode()関数のオプションとして指定すると、上記のようなUnicode文字のエスケープ処理を行わず、元のUTF-8文字の形式で直接JSON文字列に含めることができます。例えば、日本語の「こんにちは」という文字列は、エスケープされることなくそのまま「こんにちは」としてJSONに出力されます。
この定数を使用する主なメリットは、生成されるJSON文字列の可読性が大幅に向上することです。人間が直接JSONデータを確認する際に、内容をより直感的に理解しやすくなります。また、エスケープシーケンスによる文字数の増加がなくなるため、JSONデータのファイルサイズがわずかに小さくなる効果も期待できます。
ただし、この定数を使用する際には注意が必要です。生成されたJSONデータを受け取る側のシステムやアプリケーションが、UTF-8形式のJSON文字列を正しく処理できることが前提となります。もし受信側がUTF-8に対応していない場合や、特定の文字エンコーディングを期待している場合には、文字化けや解析エラーの原因となる可能性があります。したがって、この定数は、JSONの可読性を高めたい場合や、受信側システムがUTF-8 JSONに問題なく対応していることが確実な場合に、適切に活用することが推奨されます。
構文(syntax)
1<?php 2$data = ['message' => 'こんにちは、世界!']; 3$json = json_encode($data, JSON_UNESCAPED_UNICODE); 4echo $json; 5?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
JSON_UNESCAPED_UNICODEは、json_encode()関数において、Unicode文字をエスケープせずにそのまま出力するための定数です。この定数は整数値として定義されており、json_encode()関数に渡された際に特定のエンコーディングモードを有効化します。
サンプルコード
PHP JSON_UNESCAPED_UNICODEで日本語をそのまま表示する
1<?php 2 3/** 4 * PHPのJSON処理におけるJSON_UNESCAPED_UNICODE定数の使用例を示します。 5 * この定数は json_encode() 関数に渡すオプションで、マルチバイト文字(例: 日本語)を 6 * \uXXXX の形式でエスケープせずに、そのままの文字でJSON文字列に出力します。 7 * また、エンコードされたJSON文字列を json_decode() でPHPのデータに変換する例も示します。 8 */ 9function demonstrateJsonUnescapedUnicode(): void 10{ 11 // 日本語を含む連想配列を準備 12 $data = [ 13 'name' => '山田 太郎', 14 'email' => 'yamada@example.com', 15 'city' => '東京都', 16 'message' => 'こんにちは、PHPの世界へようこそ!' 17 ]; 18 19 echo "--- JSON_UNESCAPED_UNICODE オプションなしでエンコードした場合 ---" . PHP_EOL; 20 // オプションなしの場合、日本語などのマルチバイト文字は \uXXXX 形式でエスケープされる 21 $jsonEncodedDefault = json_encode($data); 22 echo "結果: " . $jsonEncodedDefault . PHP_EOL . PHP_EOL; 23 24 echo "--- JSON_UNESCAPED_UNICODE オプション付きでエンコードした場合 ---" . PHP_EOL; 25 // JSON_UNESCAPED_UNICODE を使用すると、マルチバイト文字がエスケープされずにそのまま出力される 26 $jsonEncodedUnescaped = json_encode($data, JSON_UNESCAPED_UNICODE); 27 echo "結果: " . $jsonEncodedUnescaped . PHP_EOL . PHP_EOL; 28 29 echo "--- json_decode() を使用してデコードする場合 ---" . PHP_EOL; 30 // エスケープされていないJSON文字列を json_decode() でPHPのデータに変換 31 // json_decode() は、JSON文字列がエスケープされていてもされていなくても、正しくデコードします。 32 $decodedData = json_decode($jsonEncodedUnescaped, true); // true を指定すると連想配列としてデコード 33 echo "デコードされたデータ (name): " . ($decodedData['name'] ?? 'N/A') . PHP_EOL; 34 echo "デコードされたデータ (message): " . ($decodedData['message'] ?? 'N/A') . PHP_EOL; 35} 36 37// 関数の実行 38demonstrateJsonUnescapedUnicode();
PHPのJSON_UNESCAPED_UNICODEは、PHP 8で利用できるJSON関連の拡張機能に属する定数です。この定数自体は引数を持たず、json_encode()関数のオプションとして使用される整数値を表します。
主な用途は、PHPのデータ(配列やオブジェクト)をJSON文字列に変換するjson_encode()関数において、日本語などのマルチバイト文字が\uXXXX形式(ユニコードエスケープシーケンス)でエスケープされるのを抑制することです。通常、json_encode()はマルチバイト文字をエスケープしますが、JSON_UNESCAPED_UNICODEオプションを指定することで、文字がそのままの形でJSON文字列に出力されます。これにより、生成されるJSON文字列が人間にとって読みやすくなります。
例えば、日本語の文字列を含む配列をjson_encode()で変換する際にこのオプションを使わないと、日本語はエスケープされた形式で出力されますが、このオプションを使うと「山田 太郎」のような元の文字で出力されます。
一方、json_decode()関数は、JSON文字列をPHPのデータ形式(連想配列やオブジェクト)に変換する関数です。json_decode()は、JSON_UNESCAPED_UNICODEオプションの有無にかかわらず、エスケープされたJSON文字列も、エスケープされていないJSON文字列も、どちらも正しく元のPHPのデータ構造にデコードすることができます。
JSON_UNESCAPED_UNICODEは、json_encode()関数でマルチバイト文字(日本語など)を\uXXXX形式にエスケープせず、そのままの文字でJSON文字列に出力するためのオプションです。この定数を使用しない場合、マルチバイト文字はエスケープされますが、データとしての意味合いは変わりません。初心者が間違いやすい点として、json_decode()関数は、エンコード時にこのオプションが使われていてもいなくても、JSONデータを正しくPHPのデータ構造に変換できるため、デコード時に特別に意識する必要はありません。主に、出力されるJSONの可読性を高めたい場合や、特定の外部システムがエスケープされていないJSONを要求する場合に利用すると良いでしょう。
PHPでJSONを日本語そのまま表示する
1<?php 2 3// PHPの連想配列を準備します。このデータに日本語を含めます。 4// この配列がJSONに変換される元のデータとなります。 5$data = [ 6 'id' => 101, 7 'name' => '山田 太郎', 8 'email' => 'yamada@example.com', 9 'message' => 'こんにちは、PHPからのJSONデータです!', 10 'products' => [ 11 ['product_id' => 1, 'product_name' => 'コーヒー'], 12 ['product_id' => 2, 'product_name' => '紅茶'] 13 ] 14]; 15 16// json_encode関数を使用して、PHPのデータをJSON形式の文字列に変換します。 17// 第二引数には、JSON生成のオプションをビットマスクで指定します。 18// 19// JSON_UNESCAPED_UNICODE (PHP 5.4.0以降): 20// 日本語などのUnicode文字が '\uXXXX' の形式にエスケープされず、 21// そのままの文字でJSONに出力されます。これにより、JSONが読みやすくなります。 22// 23// JSON_PRETTY_PRINT (PHP 5.4.0以降): 24// 生成されるJSON文字列を見やすいように、インデントと改行を加えて整形します。 25// デバッグや人間が読み取る際に非常に便利です。 26$jsonString = json_encode( 27 $data, 28 JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT 29); 30 31// json_encodeが失敗した場合(例: エンコード不可能なデータが含まれる場合)はfalseを返します。 32if ($jsonString === false) { 33 echo "JSONエンコードに失敗しました。\n"; 34 // どのようなエラーが発生したかを確認できます。 35 echo "エラーメッセージ: " . json_last_error_msg() . "\n"; 36} else { 37 // 正常に変換されたJSON文字列を出力します。 38 echo $jsonString; 39} 40 41?>
このサンプルコードは、PHPのデータをJSON形式の文字列に変換する方法を示しています。まず、日本語の文字を含むPHPの連想配列$dataを用意します。これは、JSONとして出力される元のデータとなります。
次に、json_encode関数を使用して、このPHP配列をJSON形式の文字列に変換します。この関数の第二引数には、JSONの生成に関するオプションを整数値で指定します。ここで使用されているJSON_UNESCAPED_UNICODEとJSON_PRETTY_PRINTは、PHP 5.4.0以降で利用可能な定数です。
JSON_UNESCAPED_UNICODEは整数値を持ち、日本語などのUnicode文字がJSON出力時に\uXXXXのようなエスケープ形式ではなく、そのままの文字で表示されるように指示するオプションです。これにより、生成されるJSONが人間にとって読みやすくなります。一方、JSON_PRETTY_PRINTも整数値を持ち、JSON文字列にインデントと改行を加えて、より整形された見やすい形式で出力するオプションです。これら二つの定数は、ビット論理和演算子|を使って組み合わせることで、同時に適用できます。
json_encode関数は、変換に成功するとJSON形式の文字列を返しますが、失敗した場合はfalseを返します。サンプルコードでは、この戻り値を確認し、失敗した場合にはエラーメッセージも出力するようにしています。最終的に、成功した場合は整形されたJSON文字列が画面に表示されます。
JSON_UNESCAPED_UNICODEとJSON_PRETTY_PRINTは、生成されるJSONの可読性を高めるための重要なオプションです。日本語などのUnicode文字をエスケープせずに直接出力するにはJSON_UNESCAPED_UNICODEを、人間が読みやすいように整形するにはJSON_PRETTY_PRINTを使用します。これらのオプションはビットOR演算子|で複数指定できますが、json_encodeが失敗した際にfalseを返す点に注意が必要です。必ず戻り値をチェックし、エラー時はjson_last_error_msg()で詳細を確認する習慣をつけましょう。これにより、予期せぬエラーからアプリケーションを守り、堅牢性を高めることができます。