【PHP8.x】rawurldecode関数の使い方

rawurldecode関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

rawurldecode関数は、RFC 3986に準拠してURLエンコードされた文字列を元の形式にデコードする関数です。ウェブ上でデータを安全に転送するために、URI(Uniform Resource Identifier)内で特殊文字が使用できない場合に、それらを%の後に16進数2桁で表現するエンコーディングが行われます。この関数は、その%HH形式でエンコードされた部分を、対応する実際の文字に変換し直します。

例えば、エンコードされた半角スペースである%20は、この関数によって元の半角スペースに戻されます。また、日本語のようなマルチバイト文字も、UTF-8などの適切な文字コードでエンコードされていれば正しくデコードされます。

PHPには同様のデコードを行うurldecode関数もありますが、両者には重要な違いがあります。urldecode関数は+記号を半角スペースとしてデコードするのに対し、rawurldecode関数は+記号を特別なものとして扱わず、そのまま+記号として保持します。この挙動の違いは、URIのパスセグメントなど、+がスペースではなく文字としての+を意味する場合に特に重要です。

主に、ウェブサーバーが受け取ったURLのパス部分やクエリパラメータなどをPHPスクリプトで処理する際に、オリジナルの情報を正しく復元するために使用されます。これにより、URLに含まれる特殊文字やスペースが正しく解釈され、アプリケーションで利用できるようになります。

構文(syntax)

1<?php
2$encodedString = "Hello%20World%21";
3$decodedString = rawurldecode($encodedString);
4echo $decodedString;
5?>

引数(parameters)

string $string

  • string $string: URLエンコードされた文字列

戻り値(return)

string

URLエンコードされた文字列をデコードした結果を文字列として返します。

サンプルコード

rawurldecodeとurldecodeの違いを理解する

1<?php
2
3/**
4 * rawurldecode と urldecode の違いを示すサンプルコード。
5 *
6 * 主な違いは '+' (プラス記号) の扱いです。
7 * - urldecode: '+' をスペースとしてデコードします (HTMLフォームデータ `application/x-www-form-urlencoded` 形式)。
8 * - rawurldecode: '+' をそのまま残します (RFC 3986 に基づく URI コンポーネントのデコード形式)。
9 */
10function demonstrateUrlDecodingDifferences(): void
11{
12    // URLエンコードされた文字列の例
13    // - %20: スペース
14    // - +: HTMLフォームデータではスペースとして扱われるが、URIではリテラルのプラス記号
15    // - %2B: リテラルのプラス記号
16    $encodedString = "Hello%20World+PHP%2B8";
17
18    echo "元のエンコードされた文字列: " . $encodedString . "\n\n";
19
20    // 1. urldecode() を使用したデコード
21    //    '+' がスペースにデコードされる点に注目
22    $decodedWithUrldecode = urldecode($encodedString);
23    echo "urldecode() の結果:     " . $decodedWithUrldecode . "\n";
24    echo "  (説明: '+' がスペースにデコードされました)\n\n";
25
26    // 2. rawurldecode() を使用したデコード
27    //    '+' がそのまま残る点に注目
28    $decodedWithRawurldecode = rawurldecode($encodedString);
29    echo "rawurldecode() の結果: " . $decodedWithRawurldecode . "\n";
30    echo "  (説明: '+' はスペースにデコードされず、元の記号のままです)\n";
31}
32
33// 関数を実行して結果を表示
34demonstrateUrlDecodingDifferences();

PHP 8のrawurldecode関数は、URLエンコードされた文字列をデコードするために使用されます。引数にはデコードしたいstring型の文字列を渡し、デコードされたstring型の文字列が戻り値として返されます。この関数は、URIの構成要素(RFC 3986)に準拠してデコードを行う点が特徴です。

rawurldecodeとよく似た関数にurldecodeがありますが、最も重要な違いは「+」(プラス記号)の扱いです。urldecodeは、HTMLフォームのデータ形式(application/x-www-form-urlencoded)を想定しているため、文字列中の「+」記号を半角スペースにデコードします。これに対し、rawurldecodeは「+」記号をスペースとしてデコードせず、元の「+」記号のまま保持します。

例えば、"Hello%20World+PHP%2B8"というURLエンコードされた文字列をデコードする場合を考えます。urldecodeを使用すると「Hello World PHP+8」となり、中央の「+」はスペースに変換されます。一方、rawurldecodeを使用すると「Hello World+PHP+8」となり、中央の「+」はそのまま維持されます。

したがって、Webフォームからのデータのように「+」がスペースを意味する場合にはurldecodeを、URLパスやクエリパラメータなど「+」がリテラルのプラス記号として扱われるべき場合にはrawurldecodeを使い分けることが重要です。

このサンプルコードの注意点は、rawurldecodeurldecodeの最も重要な違いである+(プラス記号)の扱いです。urldecode+をスペースとしてデコードしますが、これは主にHTMLフォームデータ形式のデコードに適しています。対してrawurldecode+をそのまま保持し、RFC 3986に準拠したURIコンポーネントのデコードに利用されます。初心者が間違いやすいのは、データのエンコード形式を考慮せずにデコード関数を選んでしまう点です。入力データがHTMLフォーム由来ならurldecodeを、URIのパスやクエリパラメータの個別の値であればrawurldecodeを選択するなど、用途に応じて適切に関数を使い分けることが、安全かつ正確な処理を行う上で非常に重要です。

PHP rawurldecodeでURLエンコードをデコードする

1<?php
2
3/**
4 * rawurldecode関数の使用例。
5 * この関数は、URLエンコードされた文字列をデコードします。
6 * 特に、スペースが '%20' としてエンコードされている場合に有用です。
7 */
8
9// URLエンコードされた文字列の例を定義します。
10// 例1: 英数字とスペースが'%20'でエンコードされた文字列
11$encodedString1 = "Hello%20World%21";
12
13// 例2: 別の英数字とスペースが'%20'でエンコードされた文字列
14$encodedString2 = "PHP%20is%20awesome%21";
15
16// 例3: 日本語(マルチバイト文字)がUTF-8でURLエンコードされた文字列「テスト・文字」
17$encodedString3 = "%E3%83%86%E3%82%B9%E3%83%88%E3%83%BB%E6%96%87%E5%AD%97";
18
19echo "--- rawurldecode の使用例 ---" . PHP_EOL . PHP_EOL;
20
21// 最初の文字列をデコードし、結果を表示します。
22echo "元の文字列 (Encoded): " . $encodedString1 . PHP_EOL;
23$decodedString1 = rawurldecode($encodedString1);
24echo "デコード後 (Decoded):  " . $decodedString1 . PHP_EOL . PHP_EOL;
25
26// 2番目の文字列をデコードし、結果を表示します。
27echo "元の文字列 (Encoded): " . $encodedString2 . PHP_EOL;
28$decodedString2 = rawurldecode($encodedString2);
29echo "デコード後 (Decoded):  " . $decodedString2 . PHP_EOL . PHP_EOL;
30
31// 日本語を含む文字列をデコードし、結果を表示します。
32echo "元の文字列 (Encoded): " . $encodedString3 . PHP_EOL;
33$decodedString3 = rawurldecode($encodedString3);
34echo "デコード後 (Decoded):  " . $decodedString3 . PHP_EOL . PHP_EOL;
35
36?>

rawurldecode関数は、PHPにおいてURLエンコードされた文字列を元の形式に戻すために使用される関数です。インターネット上でデータを安全にやり取りする際、スペースや日本語のような特殊な文字は直接使用できないため、%と16進数表記に変換されるURLエンコードが行われますが、この関数はその逆の処理を行います。

特にrawurldecode関数は、URLエンコードされた文字列内でスペースが+ではなく%20としてエンコードされている場合に、これを適切にスペースとしてデコードするのに適しています。引数にはデコードしたいURLエンコード済みの文字列をstring型で渡し、処理が成功するとデコードされた文字列がstring型で返されます。

サンプルコードでは、"Hello%20World%21""PHP%20is%20awesome%21"のようにスペースが%20でエンコードされた文字列をrawurldecode関数でデコードし、それぞれ"Hello World!""PHP is awesome!"という元の文字列に戻しています。また、日本語の"%E3%83%86%E3%83%83%E3%83%88%E3%83%BB%E6%96%87%E5%AD%97"といったマルチバイト文字がエンコードされた文字列も正しくデコードされ、"テスト・文字"と表示されることを確認できます。ウェブアプリケーション開発において、URLから取得したデータやフォームからの入力を処理する際に、この関数は非常に役立ちます。

rawurldecode関数は、URLパスなどで利用される%XX形式のURLエンコードをデコードします。特にスペースが%20としてエンコードされている場合に適切です。似た関数にurldecodeがありますが、こちらはスペースを+記号としてもデコードする点で異なります。rawurldecode+をそのまま+として扱います。日本語などのマルチバイト文字をデコードする際も、元のエンコーディング形式(通常はUTF-8)が保持されたバイト列として結果が返されます。文字化けを防ぐためにも、エンコード時とデコード時で一貫したエンコーディングを使用しているか確認することが重要です。適切に使い分け、安全に処理してください。

関連コンテンツ

【PHP8.x】rawurldecode関数の使い方 | いっしー@Webエンジニア