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

【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に統一することが文字化けを防ぐ上で非常に重要です。

PHP urlencode関数でスラッシュをエンコードする

1<?php
2
3/**
4 * urlencode関数の基本的な使い方と、スラッシュのエンコード動作を示すサンプルコード。
5 *
6 * urlencode関数は、URLの一部として安全に送信できるように文字列をエンコードします。
7 * スラッシュ('/')はURLのパス区切り文字として使用されるため、urlencodeではエンコードされません。
8 */
9function demonstrateUrlencodeWithSlash(): void
10{
11    // スラッシュを含むサンプル文字列を定義
12    $originalString = '商品名/カテゴリ名?データID=123&検索キーワード=プログラミング 言語';
13
14    echo "元の文字列: " . $originalString . PHP_EOL;
15
16    // urlencode関数を使用して文字列をエンコード
17    $encodedString = urlencode($originalString);
18
19    echo "urlencode後の文字列: " . $encodedString . PHP_EOL;
20
21    // スラッシュのエンコード動作に関する補足
22    echo PHP_EOL;
23    echo "【urlencode() 関数とスラッシュについて】" . PHP_EOL;
24    echo "urlencode() 関数は、URLのパス区切り文字として機能するスラッシュ('/')を、" . PHP_EOL;
25    echo "デフォルトではエンコードしません。上記の出力でも、'商品名/カテゴリ名' のスラッシュはそのままです。" . PHP_EOL;
26    echo "これは、スラッシュがURLの構造的な意味を持つ文字であるためです。" . PHP_EOL;
27}
28
29// 関数を実行して動作を確認
30demonstrateUrlencodeWithSlash();
31
32?>

PHPのurlencode関数は、URLの一部として安全に送信できるように、文字列内の特殊文字をエンコード(符号化)するPHP 8で利用できる関数です。この関数は、Webブラウザのアドレスバーやフォーム送信の際に、日本語やスペース、記号などが正しく扱われるようにするために不可欠です。

引数にはエンコードしたい文字列(string $string)を一つ指定し、エンコードされた新しい文字列(string)が戻り値として返されます。例えば、スペースは「%20」のように変換されます。

サンプルコードでは、「商品名/カテゴリ名?データID=123&検索キーワード=プログラミング 言語」という文字列をurlencode関数で処理しています。ここで特に注目すべきは、スラッシュ(/)の扱いです。urlencode関数は、URLのパス区切り文字として構造的な意味を持つため、デフォルトではスラッシュをエンコードしません。そのため、エンコード後の文字列でも「商品名/カテゴリ名」の部分のスラッシュはそのまま維持されていることが確認できます。この挙動は、URLの構造を保ちつつ、その中のデータを安全に転送するために非常に重要です。

urlencode関数は、URLに利用できない文字を安全な形式に変換しますが、特にスラッシュ('/')の扱いに注意が必要です。この関数はスラッシュをURLのパス区切り文字と解釈し、デフォルトではエンコードしません。そのため、スラッシュを含む文字列をURLの特定部分(特にパスの一部)に埋め込む際は、意図したURL構造と異なる解釈をされないか確認してください。また、半角スペースは+記号にエンコードされます。主にURLのクエリパラメータの値など、URLの一部として文字列を渡す際に利用し、受け取り側ではurldecode()関数で元の文字列に戻して使用することが一般的です。この特性を理解し、安全なURL生成に役立ててください。

PHP urlencodeとurldecodeでURLを安全に扱う

1<?php
2
3/**
4 * このスクリプトは、URLエンコードとデコードの基本的な使い方を示します。
5 * システムエンジニアを目指す初心者向けに、URLで特殊な文字を安全に扱う方法を理解するのに役立ちます。
6 */
7
8// エンコードする元の文字列を定義します。
9// スペースや日本語、特殊文字(&, = など)はURLで問題を引き起こす可能性があるため、エンコードが必要です。
10$originalString = "Hello World! これはテストです。& key=value";
11
12echo "元の文字列: " . $originalString . PHP_EOL;
13
14// urlencode() 関数を使用して文字列をURLエンコードします。
15// これは、URLの一部として渡されるクエリパラメータなどに利用されます。
16$encodedString = urlencode($originalString);
17
18echo "エンコードされた文字列: " . $encodedString . PHP_EOL;
19
20// urldecode() 関数を使用してエンコードされた文字列をデコードします。
21// これにより、元の文字列を復元できます。
22$decodedString = urldecode($encodedString);
23
24echo "デコードされた文字列: " . $decodedString . PHP_EOL;
25
26?>

PHPのurlencode関数は、ウェブアドレス(URL)で直接使用できない特殊な文字、日本語、スペースなどを、URLで安全に扱える形式に変換(エンコード)するために利用されます。これは、特にURLのクエリパラメータとしてデータを渡す際に非常に重要です。例えば、「&」や「=」といった文字はURLの区切り文字として機能するため、これらをそのまま渡すと意図しない解釈をされる可能性があります。

この関数はstring $stringという引数を受け取り、エンコードしたい元の文字列を指定します。処理が成功すると、URLエンコードされた新しい文字列をstring型で返します。元の文字列自体は変更されません。

サンプルコードでは、"Hello World! これはテストです。& key=value"という元の文字列を定義しています。urlencode()を適用すると、スペースが「%20」に、日本語が「%E3%81%93%E3%82%8C」といった形式に、そして「&」が「%26」のように変換され、URLで安全に扱える形式になります。

エンコードされた文字列は、ブラウザやサーバー側で正しく解釈するために、通常は受信側で元の形式に戻す必要があります。その際に使用するのがurldecode()関数です。urldecode()関数にエンコードされた文字列を渡すと、元の状態にデコードされ、元の文字列が復元されます。この一連のプロセスは、ウェブアプリケーションでユーザーからの入力をURL経由で安全に送受信する際の基本的な技術です。

PHPのurlencode関数は、URLのクエリパラメータなど、特定の文字列を安全に変換するために利用します。スペースや日本語、&=といった特殊な記号はURLで問題を起こしやすいため、この関数でエンコードすることで安全に扱えるようになります。エンコードされたデータを受け取った側では、元の文字列に戻すためにurldecode関数を必ず使用してください。URLのパス部分全体にはこの関数を適用せず、主にパラメータの値部分に使用することが重要です。また、異なるシステム間でデータをやり取りする際は、エンコード・デコードの前に文字列がUTF-8であることを確認すると、文字化けを防げます。

関連コンテンツ

関連IT用語

関連プログラミング言語