Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【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_UNICODEJSON_PRETTY_PRINTは、PHP 5.4.0以降で利用可能な定数です。

JSON_UNESCAPED_UNICODEは整数値を持ち、日本語などのUnicode文字がJSON出力時に\uXXXXのようなエスケープ形式ではなく、そのままの文字で表示されるように指示するオプションです。これにより、生成されるJSONが人間にとって読みやすくなります。一方、JSON_PRETTY_PRINTも整数値を持ち、JSON文字列にインデントと改行を加えて、より整形された見やすい形式で出力するオプションです。これら二つの定数は、ビット論理和演算子|を使って組み合わせることで、同時に適用できます。

json_encode関数は、変換に成功するとJSON形式の文字列を返しますが、失敗した場合はfalseを返します。サンプルコードでは、この戻り値を確認し、失敗した場合にはエラーメッセージも出力するようにしています。最終的に、成功した場合は整形されたJSON文字列が画面に表示されます。

JSON_UNESCAPED_UNICODEJSON_PRETTY_PRINTは、生成されるJSONの可読性を高めるための重要なオプションです。日本語などのUnicode文字をエスケープせずに直接出力するにはJSON_UNESCAPED_UNICODEを、人間が読みやすいように整形するにはJSON_PRETTY_PRINTを使用します。これらのオプションはビットOR演算子|で複数指定できますが、json_encodeが失敗した際にfalseを返す点に注意が必要です。必ず戻り値をチェックし、エラー時はjson_last_error_msg()で詳細を確認する習慣をつけましょう。これにより、予期せぬエラーからアプリケーションを守り、堅牢性を高めることができます。

関連コンテンツ