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

【PHP8.x】urldecode()関数の使い方

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

作成日: 更新日:

基本的な使い方

urldecode関数は、URLエンコードされた文字列をデコードする関数です。この関数は、Webブラウザのアドレスバーやフォームの送信などで使われるURLに、特殊な意味を持つ文字(例えば&=)や、日本語のようなマルチバイト文字が含まれている場合に、それらの文字が誤動作しないように%と16進数で表現された形式に変換されたものを、元の文字列に戻す役割を持っています。

具体的には、引数としてURLエンコードされた文字列を一つ受け取り、デコードされた新しい文字列を返します。例えば、スペースは+%20としてエンコードされますが、urldecode関数ではこれらを元のスペースに戻します。特に、+としてエンコードされたスペースも適切にデコードされる点が特徴です。

Webアプリケーションにおいて、ユーザーからの入力をURLパラメータとして受け取った際や、Cookieに保存されたURLエンコード済みのデータを読み込む際などに、元の意味を持つ文字列として扱うためにこの関数が広く利用されます。urlencode関数と対になる関数であり、安全にデータをやり取りするために不可欠な機能の一つです。この関数は、RFC 3986 (Uniform Resource Identifier (URI): Generic Syntax) で定義されているURLエンコードのルールに基づいています。

構文(syntax)

1<?php
2$encoded_string = "Hello%20World%21";
3$decoded_string = urldecode($encoded_string);
4echo $decoded_string;
5?>

引数(parameters)

string $string

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

戻り値(return)

string

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

サンプルコード

PHP urldecode() オンラインデモ

1<?php
2
3declare(strict_types=1);
4
5/**
6 * URLエンコードされた文字列をデコードするオンラインツールのサンプルです。
7 *
8 * このスクリプトは、Webフォームから送信された文字列を受け取り、
9 * urldecode() 関数を使用してデコードし、その結果を表示します。
10 * 1つのファイルで動作するように設計されています。
11 */
12
13// 初期化
14$encodedString = '';
15$decodedString = null;
16
17// HTTP POSTリクエストがあった場合のみ処理を実行
18if ($_SERVER['REQUEST_METHOD'] === 'POST') {
19    // フォームから 'encoded_string' の値を取得
20    $encodedString = $_POST['encoded_string'] ?? '';
21
22    if ($encodedString !== '') {
23        // urldecode() を使って文字列をデコードする
24        // 例: 'PHP+%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB' -> 'PHP サンプル'
25        $decodedString = urldecode($encodedString);
26    }
27}
28
29?>
30<!DOCTYPE html>
31<html lang="ja">
32<head>
33    <meta charset="UTF-8">
34    <title>PHP urldecode() Online Demo</title>
35    <style>
36        body { font-family: sans-serif; line-height: 1.6; padding: 2em; }
37        .container { max-width: 700px; margin: 0 auto; }
38        textarea { width: 100%; height: 120px; margin-bottom: 1em; }
39        button { padding: 0.5em 1.5em; }
40        pre { background-color: #f0f0f0; padding: 1em; border: 1px solid #ccc; white-space: pre-wrap; word-wrap: break-word; }
41    </style>
42</head>
43<body>
44    <div class="container">
45        <h1>PHP <code>urldecode()</code> オンラインデモ</h1>
46        <p>
47            URLエンコードされた文字列(例: <code>PHP+%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB</code>)を入力してデコードします。
48        </p>
49        <form action="" method="POST">
50            <div>
51                <label for="encoded_string">URLエンコードされた文字列:</label>
52                <textarea id="encoded_string" name="encoded_string"><?= htmlspecialchars($encodedString, ENT_QUOTES, 'UTF-8') ?></textarea>
53            </div>
54            <button type="submit">デコード実行</button>
55        </form>
56
57        <?php if ($decodedString !== null): ?>
58            <h2>デコード結果:</h2>
59            <pre><?= htmlspecialchars($decodedString, ENT_QUOTES, 'UTF-8') ?></pre>
60        <?php endif; ?>
61    </div>
62</body>
63</html>

PHPのurldecode()関数は、URLエンコードされた文字列を、人間が読める元の文字列に戻す(デコードする)ための関数です。URLエンコードとは、URLとして安全に送信するために、スペースが+記号に、日本語などのマルチバイト文字が%から始まる16進数コードに変換される処理のことです。urldecode()は、このエンコードされた文字列を元の状態に戻します。

この関数は、引数にデコードしたい文字列を1つ指定します。処理が成功すると、デコードされた文字列を戻り値として返します。

このサンプルコードは、urldecode()の動作を試せるオンラインツールです。WebページのフォームにURLエンコードされた文字列(例: PHP+%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB)を入力し、送信ボタンを押します。すると、PHPスクリプトがその文字列をurldecode()関数で処理し、デコードされた結果(例: PHP サンプル)を画面に表示します。このように、WebアプリケーションでURLのパラメータやフォームから送信されたデータを扱う際に利用される重要な関数です。

urldecode()関数は、URLエンコードされた文字列を元の形に戻すためのものです。特に「%」で始まる16進数コードを文字に、プラス記号(+)を半角スペースに変換します。似た関数にrawurldecode()がありますが、こちらはプラス記号を変換しないという違いがあるため、用途に応じて使い分ける必要があります。このサンプルコードで最も重要な点は、ユーザーが入力した値を画面に表示する際にhtmlspecialchars()関数を使用していることです。これにより、悪意のあるスクリプトの埋め込み(クロスサイトスクリプティング)を防いでいます。また、$_POSTからの値の取得に?? ''と記述することで、未送信時のエラーを回避しており、安全なコードを書く上での良い実践例です。

urldecode()とrawurldecode()の違いを理解する

1<?php
2
3/**
4 * urldecode() と rawurldecode() の違いを示すサンプルコード。
5 *
6 * この関数は、URLエンコードされた文字列をデコードする際の
7 * 両関数の挙動の違い、特にプラス記号 ('+') の扱いに焦点を当てて説明します。
8 */
9function demonstrateUrlDecodeDifferences(): void
10{
11    // ケース1: スペースが '+' でエンコードされている可能性のあるフォームデータ形式の文字列
12    // (例: HTMLフォームの 'application/x-www-form-urlencoded' での送信データ)
13    // ここでは、実際のスペースは '+' で、リテラルの '+' は '%2B' で表現されています。
14    $encodedStringForm = "Search+Query%2BPHP";
15    echo "--- ケース1: 'Search+Query%2BPHP' (フォームデータ形式) ---\n";
16    echo "元のエンコードされた文字列: " . $encodedStringForm . "\n";
17    echo "urldecode() でデコード:    " . urldecode($encodedStringForm) . "\n";
18    echo "rawurldecode() でデコード: " . rawurldecode($encodedStringForm) . "\n";
19    echo "コメント: urldecode() は '+' をスペースに変換します。\n";
20    echo "          rawurldecode() は '+' をそのまま '+' として扱います。\n\n";
21
22    // ケース2: RFC 3986 に従ってエンコードされたURI形式の文字列
23    // (例: URIパスやクエリパラメータ)
24    // ここでは、スペースは '%20' で、リテラルの '+' は '%2B' で表現されています。
25    $encodedStringUri = "Path%2FTo%2FFile%20with%2Bplus";
26    echo "--- ケース2: 'Path%2FTo%2FFile%20with%2Bplus' (RFC 3986 URI形式) ---\n";
27    echo "元のエンコードされた文字列: " . $encodedStringUri . "\n";
28    echo "urldecode() でデコード:    " . urldecode($encodedStringUri) . "\n";
29    echo "rawurldecode() でデコード: " . rawurldecode($encodedStringUri) . "\n";
30    echo "コメント: RFC 3986 ではスペースは '%20' でエンコードされるため、\n";
31    echo "          両関数ともに '%20' をスペースに、'%2B' を '+' にデコードし、結果は同じになります。\n";
32}
33
34// サンプル関数の実行
35demonstrateUrlDecodeDifferences();
36
37?>

urldecode関数は、URLエンコードされた文字列をデコードし、元の文字列に戻すためのPHP関数です。引数にデコードしたい文字列を渡すと、デコードされた文字列が戻り値として返されます。

この関数とよく似たrawurldecode関数との最も重要な違いは、プラス記号(+)の扱いです。urldecode関数は、プラス記号を半角スペースに変換します。これは、Webフォームでデータを送信する際に使われるapplication/x-www-form-urlencodedという形式のルールに基づいています。

サンプルコードのケース1では、「Search+Query%2BPHP」という文字列をデコードしています。urldecode+をスペースに変換するため「Search Query+PHP」という結果になります。一方、rawurldecode+を変換せず、そのままプラス記号として扱うため「Search+Query+PHP」となります。なお、%2Bのようなパーセントエンコーディングされた文字は、どちらの関数も正しくプラス記号にデコードします。

このように、スペースのエンコード方法が異なるため、Webフォームのデータを扱う際にはurldecodeを、URIのパス部分などRFC 3986の仕様に沿ったデータを扱う際にはrawurldecodeを使い分けるのが一般的です。

urldecode関数は、プラス記号(+)を半角スペースに変換する特性があります。これは、主にHTMLフォームから送信されるデータ形式(application/x-www-form-urlencoded)をデコードするために設計されているためです。一方で、rawurldecode関数はプラス記号を変換せず、そのまま扱います。URLのパス部分など、一般的なURLエンコーディング(RFC 3986準拠)ではスペースは%20として表現されるため、こちらのデコードにはrawurldecodeが適しています。デコードしたい文字列の出自を意識し、フォームデータならurldecode、それ以外のURL要素ならrawurldecodeと使い分けることが、意図しないデータ変換を防ぎ、正しく処理を行う上で非常に重要です。

PHP urldecode関数でURLエンコード文字列をデコードする

1<?php
2
3/**
4 * URLエンコードされた文字列をデコードするサンプル関数。
5 *
6 * システムエンジニアを目指す初心者の方にも分かりやすいように、
7 * PHPのurldecode関数の基本的な使い方と、特に「文字コード」の側面について示します。
8 * URLエンコードは、URLで特殊な意味を持つ文字や多言語文字を安全に転送するために使用されます。
9 *
10 * @param string $encodedString デコードするURLエンコードされた文字列
11 * @return void
12 */
13function decodeUrlEncodedStringExample(string $encodedString): void
14{
15    echo "--- urldecode関数による文字列デコード --- \n\n";
16
17    echo "元のURLエンコードされた文字列:\n";
18    echo $encodedString . "\n\n";
19
20    // urldecode関数を使用して文字列をデコードします。
21    // この関数は、`%xx` の形式でエンコードされた文字シーケンスを元の文字に戻します。
22    // 例: `%E3%83%97` は「プ」という文字の一部を表します。
23    //
24    // 重要: urldecode関数自体は文字コード変換を行いません。
25    // デコードされた文字列の文字コードは、エンコードされる前の元の文字列の文字コードに依存します。
26    // 一般的なWebアプリケーションでは、UTF-8が広く利用されています。
27    $decodedString = urldecode($encodedString);
28
29    echo "デコード後の文字列:\n";
30    echo $decodedString . "\n\n";
31
32    // 文字コードに関する補足情報:
33    // 日本語のようなマルチバイト文字を扱う際には、文字コードが非常に重要です。
34    // デコードされた文字列が正しく表示されない場合、それはエンコード時の文字コードと、
35    // PHPがその文字列を解釈しようとする際の文字コードが異なっていることが原因の可能性があります。
36    // この例では、元の文字列がUTF-8でエンコードされていることを想定しています。
37    echo "デコード後の文字列のバイト数: " . strlen($decodedString) . " バイト\n";
38    echo "デコード後の文字列の文字数 (UTF-8の場合): " . mb_strlen($decodedString, 'UTF-8') . " 文字\n";
39    echo "デコード後の文字列の推定文字コード: " . (mb_detect_encoding($decodedString, ['UTF-8', 'SJIS', 'EUC-JP'], true) ?: '不明') . "\n";
40}
41
42// ----------------------------------------------------
43// サンプルデータの準備
44// ----------------------------------------------------
45
46// 例1: 日本語を含むURLエンコードされた文字列 (UTF-8を想定)
47// これは「PHPプログラミングと文字コード」という文字列をrawurlencode()でエンコードしたものです。
48// rawurlencodeはスペースを%20にエンコードし、urldecodeとの相性が良いです。
49$sampleEncodedString1 = "PHP%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%A8%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89";
50
51// 関数を実行してデコード結果を確認
52decodeUrlEncodedStringExample($sampleEncodedString1);
53
54echo "\n----------------------------------------------------\n";
55
56// 例2: スペースが'+'で表現された文字列の場合の注意
57// urldecodeは'+'をスペースとして自動的にはデコードしません。
58// HTMLフォームのapplication/x-www-form-urlencoded形式ではスペースが'+'になりますが、
59// そのようなケースでスペースを正しくデコードしたい場合は別途 str_replace() を使うなどの処理が必要です。
60$sampleEncodedString2 = "Hello+World%21"; // 「Hello World!」を想定
61
62echo "\n--- '+'記号を含む文字列のデコード例 --- \n\n";
63echo "元のURLエンコードされた文字列: " . $sampleEncodedString2 . "\n";
64$decodedString2 = urldecode($sampleEncodedString2);
65echo "urldecode後の文字列: " . $decodedString2 . " (※'+'がデコードされていないことに注目)\n";
66
67// '+'をスペースとして扱う必要がある場合の処理
68$decodedString2WithSpace = str_replace('+', ' ', $decodedString2);
69echo "str_replaceで'+'をスペースに変換後: " . $decodedString2WithSpace . "\n";
70
71echo "\n----------------------------------------------------\n";
72

PHP 8のurldecode関数は、URLエンコードされた文字列を元の形式に戻すために使用されます。この関数は、引数としてデコードしたい文字列(string $string)を受け取り、デコードされた文字列(string)を返します。URLエンコードとは、URLで特殊な意味を持つ文字や多言語文字を安全に転送できるよう、%xxのような形式に変換することです。

重要な点として、urldecode関数自体は文字コードの変換を行いません。デコードされた文字列の文字コードは、エンコードされる前の元の文字列の文字コードに依存します。そのため、日本語のようなマルチバイト文字を扱う際には、エンコード時とデコード時の文字コードの一貫性が非常に重要です。例えば、UTF-8でエンコードされた文字列は、デコード後もUTF-8として正しく解釈される必要があります。

また、Webフォームなどでよく使われるapplication/x-www-form-urlencoded形式では、スペースが+記号で表現されることがありますが、urldecode関数はデフォルトでこの+記号をスペースにデコードしません。+をスペースとして処理する必要がある場合は、str_replace()関数などを用いて別途変換を行う必要があります。本サンプルコードは、これらの挙動を具体例とともに示しており、システムエンジニアを目指す方々がURL処理と文字コードの関連性を理解する手助けとなるでしょう。

PHPのurldecode関数は、URLエンコードされた文字列(%xx形式)を元の文字列にデコードします。この関数を使う上で特に重要な注意点は、文字コードの変換は行わない点です。デコード後の文字列の文字コードは、エンコードされる前の元の文字列の文字コードに依存するため、特に日本語などのマルチバイト文字を扱う際には、エンコード時とデコード時の文字コード(一般的にはUTF-8が推奨されます)が一致していることを常に確認してください。文字化けが発生する場合、多くはこの文字コードの不一致が原因です。

また、Webフォームでよく使われるapplication/x-www-form-urlencoded形式では、スペースが+記号でエンコードされますが、urldecode関数は**+記号を自動的にスペースに変換しません**。したがって、フォームデータなどをデコードする場合は、urldecodeの実行後にstr_replace('+', ' ', $decodedString)のように別途+をスペースに置換する処理が必要になります。これらの点に注意し、適切に処理を施すことで、文字列を安全かつ正しく利用できます。

PHP urldecode not working: 二重エンコードを解決する

1<?php
2
3/**
4 * URLエンコードされた文字列をデコードするサンプル関数。
5 * `urldecode`関数が期待通りに動作しない("not working")と感じる
6 * 一般的なシナリオに焦点を当て、その解決策を示します。
7 *
8 * 主に以下のケースを扱います:
9 * 1. `%xx`形式と`+`記号(スペースとしてエンコードされたもの)のデコード。
10 * 2. 文字列が二重エンコードされている場合の挙動。
11 *
12 * @param string $initialEncodedString デコード処理の起点となるURLエンコードされた文字列
13 * @return void
14 */
15function demonstrateUrlDecodeNotWorkingScenarios(string $initialEncodedString): void
16{
17    echo "--- 基本的なURLデコード ---" . PHP_EOL;
18    echo "元のエンコードされた文字列: " . $initialEncodedString . PHP_EOL;
19    $decodedBasic = urldecode($initialEncodedString);
20    echo "urldecode後: " . $decodedBasic . PHP_EOL;
21    echo PHP_EOL;
22
23    echo "--- '+' 記号のデコード例 ---" . PHP_EOL;
24    // `urldecode` は、URLエンコード形式の `%20` と、
25    // application/x-www-form-urlencoded 形式の `+` の両方をスペースにデコードします。
26    // 「+がデコードされない」と感じる場合、他の原因が考えられます。
27    $plusEncoded = "Query+String+With+Plus+Signs%20and%20Percent20.";
28    echo "'+'を含むエンコード文字列: " . $plusEncoded . PHP_EOL;
29    $decodedPlus = urldecode($plusEncoded);
30    echo "urldecode後: " . $decodedPlus . PHP_EOL;
31    echo PHP_EOL;
32
33    echo "--- 二重エンコードの例 ---" . PHP_EOL;
34    // 「urldecode not working」と感じる最も一般的な原因の一つは、
35    // 文字列が複数回エンコードされている場合です。
36    // この場合、一度の `urldecode` では完全にデコードされません。
37
38    $originalContent = "これは二重エンコードされる文字列です!日本語も含む。";
39    echo "元のコンテンツ: " . $originalContent . PHP_EOL;
40
41    // 1回目のエンコード
42    $firstEncoded = urlencode($originalContent);
43    echo "1回エンコード後: " . $firstEncoded . PHP_EOL;
44    // (例: "これは%E二重%エンコード...")
45
46    // 2回目のエンコード (例えば、URLパラメータの値がさらにURLエンコードされるようなケース)
47    $doubleEncoded = urlencode($firstEncoded);
48    echo "2回エンコード後 (二重エンコード): " . $doubleEncoded . PHP_EOL;
49    // (例: "これは%25E二重%25エンコード...")
50
51    // 一度目のデコードを試みる
52    $attempt1 = urldecode($doubleEncoded);
53    echo "1回urldecode後: " . $attempt1 . PHP_EOL;
54    // この時点では `%25` が `%` にデコードされただけで、まだ読めない形式です。
55    // ここで「urldecode not working」と感じることがあります。
56
57    // 二度目のデコードで完全に元の文字列に戻る
58    $attempt2 = urldecode($attempt1);
59    echo "2回urldecode後 (完全にデコード): " . $attempt2 . PHP_EOL;
60
61    // 注意: 二重エンコードは設計上の問題であることが多いため、
62    // 根本原因(エンコードが二重に行われている箇所)を特定し、
63    // 適切な回数だけエンコード/デコードを行うことが推奨されます。
64}
65
66// サンプルとして、基本的なURLエンコード文字列を用いて関数を実行します。
67// 例: "Hello World! PHP 8" が "%20" でエンコードされたもの
68demonstrateUrlDecodeNotWorkingScenarios("Hello%20World%21%20PHP%208%20Example.");
69
70?>

PHPのurldecode関数は、URLエンコードされた文字列を元の形式に戻すために使用されます。この関数は、引数としてデコードしたいstring型のURLエンコード文字列を受け取り、デコードされたstring型の文字列を戻り値として返します。

urldecodeは、%xx形式(例: %20がスペース)のエンコードだけでなく、application/x-www-form-urlencoded形式でスペースを表す+記号も自動的にスペースにデコードします。そのため、「+がデコードされない」と感じる場合は、他の要因が考えられます。

urldecodeが期待通りに動作しない("not working")」と感じる最も一般的なケースは、文字列が複数回エンコードされている「二重エンコード」です。例えば、一度urlencodeでエンコードされた文字列が、さらに再度urlencodeされると二重エンコードの状態になります。このような文字列に対してurldecodeを一度実行しても、完全に元の状態には戻らず、さらに一度urldecodeを実行することで初めて元の文字列に戻ります。サンプルコードでは、この二重エンコードの挙動と、+記号が正しくデコードされる様子を示しています。

実際のシステム開発では、文字列が意図せず二重エンコードされないよう、エンコード処理の回数と箇所を適切に管理することが重要です。

PHPのurldecode関数は、URLエンコードされた文字列に含まれる%xx形式と、スペースを表す+記号の両方を正しくデコードします。もし+記号がデコードされないと感じる場合、それは文字列がURLエンコード形式ではないか、期待通りにエンコードされていない可能性があります。

また、「urldecodeが期待通りに動作しない」と感じる一般的な原因の一つに、文字列が複数回エンコードされている「二重エンコード」が挙げられます。この場合、一度のurldecodeでは完全にデコードされず、複数回適用する必要が生じます。

しかし、二重エンコードは通常、システム設計上の問題であることが多いため、文字列がなぜ、どこで、何回エンコードされているのかを特定し、エンコード処理を適切に見直すことが推奨されます。入力される文字列のエンコード状態を常に確認し、それに合わせて一度だけurldecodeを適用することが、安全で意図通りの動作を実現するための重要なポイントです。

関連コンテンツ

関連IT用語

関連プログラミング言語