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

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

作成日: 更新日:

基本的な使い方

urlencode関数は、文字列をURLエンコードする処理を実行する関数です。ウェブアプリケーションにおいて、URLに日本語などの特殊文字や記号を含める場合、それらの文字はそのままでは正しく解釈されず、URLの構文規則に違反したり、データが破損したりする原因となることがあります。urlencode関数は、このような問題を回避し、ウェブサーバーやブラウザがURLを正確に解釈できるように、文字列を安全な形式に変換します。

具体的には、半角スペースは「+」(プラス記号)に、それ以外の特殊文字や非ASCII文字(例えば日本語の文字)は「%」(パーセント記号)とその文字の16進数表記に変換されます。この変換ルールは、ウェブフォームからデータを送信する際の標準的な形式であるapplication/x-www-form-urlencoded形式に準拠しています。

この関数は、ウェブサイトで検索クエリやフォームの入力値をURLのクエリパラメータとして渡す際など、URLを通じてデータを安全に送受信する必要がある場面で広く利用されます。urlencode関数は変換後の文字列を返しますので、その結果をURLに含めて利用することができます。これにより、多様な文字を含むデータも、破損することなく確実にウェブ上でやり取りできるようになります。データの整合性を保ち、ウェブアプリケーションの安定稼働に不可欠な機能の一つです。

構文(syntax)

1<?php
2$original_string = "Hello World! 日本語";
3$encoded_string = urlencode($original_string);
4echo $encoded_string;
5?>

引数(parameters)

string $string

  • string $string: URLエンコードしたい文字列

戻り値(return)

string

URLエンコードされた文字列が返されます。

サンプルコード

PHP: urlencodeとrawurlencodeの違いを比較する

1<?php
2
3/**
4 * urlencodeとrawurlencodeの違いを比較して表示します。
5 *
6 * この関数は、同じ文字列をurlencodeとrawurlencodeでそれぞれ処理し、
7 * 結果の違いを標準出力に表示することで、両関数の挙動の違いを明確にします。
8 */
9function showEncodingDifference(): void
10{
11    // 比較用の文字列。スペースとチルダ(~)を含んでいます。
12    $originalString = 'PHPの スペースと~記号';
13
14    echo '元の文字列: ' . $originalString . PHP_EOL . PHP_EOL;
15
16    // urlencode: スペースを '+' に、チルダ(~)を '%7E' に変換します。
17    // これは主にフォーム送信データ (application/x-www-form-urlencoded) で使用される形式です。
18    // 例: https://example.com/search?q=PHP%E3%81%AE+%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%A8%7E%E8%A8%98%E5%8F%B7
19    $urlEncoded = urlencode($originalString);
20    echo 'urlencode() の結果   : ' . $urlEncoded . PHP_EOL;
21
22    // rawurlencode: スペースを '%20' に変換します。チルダ(~)は変換しません。
23    // これはURLのパス部分などで使用される RFC 3986 に準拠した形式です。
24    // 例: https://example.com/files/PHP%E3%81%AE%20%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%A8~%E8%A8%98%E5%8F%B7.txt
25    $rawUrlEncoded = rawurlencode($originalString);
26    echo 'rawurlencode() の結果: ' . $rawUrlEncoded . PHP_EOL;
27}
28
29// 関数を実行して違いを確認します
30showEncodingDifference();

PHPのurlencode関数は、引数で受け取った文字列をURLエンコードするための関数です。URLでは日本語や半角スペースなど、一部の文字を直接使用することができません。この関数は、それらの文字を「%」と16進数を組み合わせた安全な形式に変換します。引数にはエンコードしたい文字列を指定し、戻り値としてエンコード後の文字列が返されます。

urlencode関数の大きな特徴は、半角スペースをプラス記号「+」に変換する点です。これはHTMLのフォーム送信などで用いられる application/x-www-form-urlencoded という形式に準拠したエンコード方法です。

一方で、よく似た関数にrawurlencodeがあります。この2つの主な違いは、スペースとチルダ()の扱いです。urlencodeがスペースを「+」に変換するのに対し、rawurlencodeは「%20」に変換します。また、チルダ()はurlencodeでは「%7E」にエンコードされますが、rawurlencodeではエンコードされません。rawurlencodeはRFC 3986という標準規格に準拠しており、主にURLのパス部分(例: /files/ファイル名.txt)のエンコードに使われます。URLのどの部分を扱うかに応じて、これら2つの関数を正しく使い分けることが重要です。

urlencoderawurlencodeは似ていますが、用途が明確に異なります。最も重要な違いはスペースの扱いです。urlencodeはスペースを+に変換し、主にフォームの送信データなど、URLの?以降のクエリ文字列をエンコードする際に使用します。一方、rawurlencodeはスペースを現代的な標準である%20に変換するため、ファイル名などURLのパス部分をエンコードする場合に適しています。チルダ(~)の扱いも異なります。URLのどの部分をエンコードするかに応じて正しく使い分けることが、意図しない動作を防ぐために重要です。クエリ文字列にはurlencode、パス部分にはrawurlencodeと覚えておくと安全です。

PHPで日本語URLエンコードする

1<?php
2
3/**
4 * 日本語文字列をURLエンコードするサンプル関数
5 *
6 * @param string $keyword URLに含めたい日本語の文字列
7 * @return void
8 */
9function demonstrateUrlEncoding(string $keyword): void
10{
11    // urlencode() を使って日本語文字列をURLセーフな形式にエンコードします。
12    // 日本語のようなマルチバイト文字や特殊記号は、
13    // 「%」に続く16進数コードに変換されます。スペースは「+」になります。
14    $encodedKeyword = urlencode($keyword);
15
16    // エンコード前とエンコード後の文字列を比較して表示します。
17    echo 'エンコード前の文字列: ' . $keyword . PHP_EOL;
18    echo 'エンコード後の文字列: ' . $encodedKeyword . PHP_EOL;
19    echo PHP_EOL; // 見やすくするための改行
20
21    // 実際にURLとして組み立てる例です。
22    // 例えば、検索エンジンのクエリパラメータとして使用します。
23    $baseUrl = 'https://example.com/search?query=';
24    $completeUrl = $baseUrl . $encodedKeyword;
25
26    echo '生成されたURLの例: ' . $completeUrl . PHP_EOL;
27    echo PHP_EOL;
28
29    // 参考: urldecode() を使えば、エンコードされた文字列を元の日本語に戻せます。
30    $decodedKeyword = urldecode($encodedKeyword);
31    echo 'デコード後の文字列: ' . $decodedKeyword . PHP_EOL;
32}
33
34// 日本語を含む文字列で関数を実行します。
35demonstrateUrlEncoding('PHPで日本語を安全に扱う方法');
36
37?>

PHPのurlencode関数は、文字列をURLの一部として安全に使える形式に変換(エンコード)するための関数です。URLでは、日本語のようなマルチバイト文字や、半角スペース、特定の記号(例: &, ?)などをそのまま使用すると、意図しない動作やエラーの原因となることがあります。urlencode関数は、これらの文字を「%」に続く16進数コードの形式に置き換え、半角スペースを「+」記号に変換することで、問題を未然に防ぎます。

この関数は、引数としてエンコードしたい文字列を1つ受け取ります。そして、エンコード処理を施した結果の文字列を戻り値として返します。

サンプルコードでは、「PHPで日本語を安全に扱う方法」という日本語の文字列をurlencode関数に渡しています。関数は、この文字列をWebブラウザやサーバーが正しく解釈できる形式に変換します。変換後の文字列は、検索クエリのようにURLの末尾に結合され、安全なURLを生成するために利用されます。このように、urlencodeはWebアプリケーションでユーザーが入力した日本語などを扱う際に不可欠な関数です。また、対になるurldecode関数を使えば、エンコードされた文字列を元の日本語に戻すことができます。

この関数は主にURLのクエリ文字列(?以降)の値を作成するために使用します。URL全体をエンコードすると、:/のような必須記号まで変換されURLが機能しなくなるため、ユーザー入力値などの可変部分のみを対象にしてください。urlencodeはスペースを+に変換しますが、これはWebフォームのデータ形式に由来します。URLのパス部分には、スペースを%20として扱うRFC 3986に準拠したrawurlencode関数の利用がより適切です。日本語のようなマルチバイト文字を正しく扱うには、プログラムファイルの文字コードをUTF-8に統一することが文字化けを防ぐ上で非常に重要です。

関連コンテンツ