URLエンコードとは?基本の意味と役割をわかりやすく解説
URLエンコードは、Web上で使われるURL(Uniform Resource Locator)に含めることができない文字を、安全に送信できる形式に変換する技術です。
URLには英数字や一部の記号しか使えず、日本語や特殊文字はそのままでは使えません。
そこで、URLエンコードを使うと、これらの文字を「%」と16進数の組み合わせに置き換えて送信します。
例えば、「スペース」は「%20」に変換されます。
この変換により、ブラウザやサーバーが正しく情報を受け取り、URLの意味が壊れないようにします。
URLで使えない文字とエンコードが必要な理由
URLに使えない文字とは、主に以下のものです。
- 日本語や漢字などの非ASCII文字
- 空白や制御文字
- 一部の記号(例:
スペース、"<", ">", "#", "%", "{", "}", "|", "\", "^", "~", "[", "]", "`"
)
これらの文字をURLにそのまま含めると、URLが正しく解釈されず通信エラーや意図しない挙動が起きます。
例えば、URLに「#」が含まれると、その後ろの部分が「ページ内の特定の位置(フラグメント識別子)」として扱われ、意図しないページ遷移や情報の欠落が発生することがあります。
また、「%」はエンコード済みの文字を示すため、そのまま使うと誤解が生じます。
なぜエンコードが必要か?
URLは基本的にASCII文字で構成されており、特定の文字はURLの区切りや意味を持つため、それらを含むと混乱が生じます。
URLエンコードはこれらの文字を「%xx」の形式に置き換え、安全にURLとして使えるように変換します。
URLエンコードの仕組み:どのように文字が変換されるのか
URLエンコードは、以下の流れで行われます。
- 対象の文字をバイト列(通常はUTF-8などの文字コードによるバイト列)に変換する。
(WebではUTF-8が標準的に使われます) - バイトごとに16進数に変換し、前に「%」を付ける。
例:
- 「あ」はUTF-8で3バイト(E3 81 82)なので、
%E3%81%82
に変換されます。 - 半角スペースはASCIIコードで32(16進数20)なので、
%20
に変換されます。
この変換により、URLとして使えない文字も安全に含められます。
PHPのurlencode()関数とは?使い方と注意点(わかりやすく解説)
PHPには文字列をURLで使える形式に変換する関数として、urlencode()
があります。
例えば、次のように使います。
$text = "こんにちは 世界";
$encoded = urlencode($text);
echo $encoded; // %E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF+%E4%B8%96%E7%95%8C
ここでのポイントは、スペース(空白)が「+(プラス記号)」に変換されることです。
つまり、「こんにちは 世界」の空白は「+」になっています。
一方で、スペースを「%20」にしたい場合は、別の関数rawurlencode()
を使います。
$text = "こんにちは 世界";
$encoded = rawurlencode($text);
echo $encoded; // %E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%20%E4%B8%96%E7%95%8C
こちらは空白が「%20」となり、また日本語部分もすべて16進数表記に変換されます。
どう使い分ける?注意点
urlencode()
は主にURLの「クエリパラメータ」部分のエンコードに向いています。
クエリパラメータとは、URLの「?」以降のkey=value
形式で渡すデータの部分のことです。
例えば、検索ワードやフォームの入力データをURLに含めるときに使います。
スペースを「+」に変換するので、Webの仕組みとして一般的に扱いやすいです。
これは、application/x-www-form-urlencoded形式に基づく仕様です。rawurlencode()
はURLの「パス部分」(ドメインの後ろのフォルダやファイル名など)をエンコードするときに使うのが適切です。
パス部分ではスペースは「%20」として扱われることが多く、RFC 3986に準拠したエンコードがされます。
より厳密にエンコードしたい場合はこちらを使います。- エンコードは必要な部分だけに使うことが大切です。
全体のURLを何度もエンコードすると、「%」がさらにエンコードされてしまい、意味がわからなくなります。
例えば、すでにエンコードされた文字列をもう一度urlencode()
すると、%
が%25
に変わり、元に戻せなくなることがあります。
多重エンコードはWeb開発でよくあるトラブルなので注意しましょう。
用途 | 推奨関数 | スペースの変換例 |
---|---|---|
クエリパラメータ(検索語など) | urlencode() | 空白 → + |
URLのパス部分(フォルダ名やファイル名) | rawurlencode() | 空白 → %20 |
URLデコードとの違いとデコード方法の基本
URLエンコードされた文字列は、サーバーやブラウザ側で元の文字列に戻す必要があります。これをURLデコードと呼びます。
PHPではurldecode()
やrawurldecode()
でデコードします。
urldecode()
は、エンコード時に「+」に変換された空白を元に戻します。
主にクエリパラメータのデコードに使います。
rawurldecode()
は、エンコード時に「%20」となった空白を元に戻します。
主にURLのパス部分のデコードに使います。
$encoded = "%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%20%E4%B8%96%E7%95%8C";
$decoded = urldecode($encoded);
echo $decoded; // こんにちは 世界
URLエンコードを理解して安全なWeb通信を実現するポイント
URLエンコードはWeb通信の基礎であり、正しく理解すると以下のメリットがあります。
- 日本語や特殊文字を含むURLの安全な送受信が可能になる
- 不正なURLの解析ミスやエラーを防止できる
- セキュリティ面でも予期しない文字列の混入を防ぐ助けになります。
例えば、不適切なエンコードを放置すると、クロスサイトスクリプティング(XSS)やSQLインジェクションのリスクが高まる可能性があります。
Web開発では特にフォーム送信やAPIリクエストで使われるため、文字列のエンコードとデコードを適切に扱いましょう。