URLエンコードとは — パーセントエンコードの仕組みと使いどころ

URLエンコード(パーセントエンコード)は、URLでそのまま使えない文字を % と16進数2桁の並びに置き換える仕組みです。標準は RFC 3986 で定義され、対象の文字を UTF-8 のバイト列に変換してから各バイトを %XX で表します。たとえば「あ」は %E3%81%82、半角スペースは %20 になります。本記事では、URLで使える文字・なぜエンコードが必要か・仕組みencodeURI と encodeURIComponent の違い・フォームでの扱い・落とし穴を正確に整理します。

結論を先に:クエリの「値」など URL の部品を組み立てるときは encodeURIComponent、URL 全体を軽く整形するだけなら encodeURI を使います。エンコードの単位は文字ではなく UTF-8 のバイトで、各バイトが %XX になる、という点を押さえれば大半は理解できます。

1. URLで使える文字 — 予約文字と非予約文字(RFC 3986)

URL(より正確には URI)で使える文字は、ASCII の限られた集合に決められています。RFC 3986 はそれを大きく 非予約文字予約文字の 2 つに分けています。

上記以外の文字(空白、日本語などの非ASCII文字、制御文字など)は、URLに直接書くことができません。これらを安全に運ぶ手段がパーセントエンコードです。

2. なぜエンコードが必要か — 区切り文字とマルチバイト

エンコードが必要になる理由は、大きく 2 つあります。

ポイントは「区切りとして使いたい記号」と「データとして使いたい記号」を区別することです。同じ & でも、パラメータの区切りなら生のまま、値の一部なら %26 にエンコードする、という使い分けになります。

3. パーセントエンコードの仕組み — %+16進・UTF-8バイト単位

パーセントエンコードの規則はシンプルです。エンコードしたい文字を UTF-8 でバイト列に変換し、各バイトを % に続けて16進数2桁(大文字推奨)で書きます。

たとえば、半角スペースは1バイト 0x20 なので %20。全角の「あ」は UTF-8 で 3 バイト 0xE3 0x81 0x82 のため、%E3%81%82%XX が3つ並びます。

文字UTF-8 バイト列パーセントエンコード
半角スペース20%20
&26%26
/2F%2F
=3D%3D
E3 81 82%E3%81%82
café の éC3 A9%C3%A9

非予約文字(A-Z a-z 0-9 - . _ ~)はエンコードしてもしなくても同じ意味になるため、通常はエンコードせず残します。

空白の %20+ は別物です。パス部分での空白は %20 が基本です。+ を空白として扱うのは クエリ文字列やフォーム送信(application/x-www-form-urlencoded)に限った歴史的な約束で、パスでは + はただの + です。混同するとデコード結果がずれます。

4. encodeURI と encodeURIComponent の違い

JavaScript には 2 つのエンコード関数があり、区切り文字を残すかどうかが決定的に違います。

入力文字encodeURIencodeURIComponent
/そのまま /%2F
?そのまま ?%3F
&そのまま &%26
=そのまま =%3D
半角スペース%20%20
%E3%81%82%E3%81%82

原則は明快です。クエリの値や1個の部品をエンコードするなら encodeURIComponent、組み上がったURL全体を整形するだけなら encodeURI。値に encodeURI を使うと &= が残り、パラメータが壊れます。

5. クエリ文字列とフォーム送信での扱い

クエリ文字列は ?key1=value1&key2=value2 の形で、& でパラメータを区切り、= でキーと値を結びます。だからこそ、キーと値のそれぞれencodeURIComponent でエンコードしてから組み立てる必要があります。

つまり「パスでは空白は %20、フォーム/クエリの慣習では + もありうる」という二面性を理解しておくと、デコード時の不一致を避けられます。

6. よくある落とし穴

最後に、実務でつまずきやすいポイントをまとめます。

Free Tool URL Encoder / Decoder で実際に試す ブラウザ内でテキストをパーセントエンコード/デコードできます。encodeURIComponent 相当の変換で、クエリ値の組み立てや確認に便利です。

よくある質問(FAQ)

URLエンコードとは何ですか?

URLエンコード(パーセントエンコード)は、URLでそのまま使えない文字を「%」と16進数2桁の並びに置き換える方式です。RFC 3986 で定義されており、対象の文字をいったんUTF-8のバイト列に変換し、各バイトを %XX の形で表します。たとえば全角の「あ」は %E3%81%82、半角スペースは %20 になります。区切り文字(?、&、/ など)と本来のデータを混同させずに安全に送るために使われます。

encodeURI と encodeURIComponent の違いは何ですか?

encodeURI はURL全体をエンコードする想定で、:、/、?、#、&、= などの区切り文字はエンコードせず残します。一方 encodeURIComponent はクエリの値やパスの一部など「部品」をエンコードする想定で、これらの区切り文字も含めて変換します。クエリ文字列の値を組み立てるときは encodeURIComponent を使うのが原則です。encodeURI を値に使うと & や = が残り、パラメータが壊れます。

日本語が %xx の羅列になるのはなぜですか?

URLで直接使える文字はASCIIの一部に限られるため、日本語などの非ASCII文字はそのまま置けません。そこで文字をUTF-8でバイト列に符号化し、各バイトを %XX で表します。日本語の多くは1文字が3バイトのため、1文字あたり %XX が3つ並びます。たとえば「あ」は3バイト(0xE3 0x81 0x82)なので %E3%81%82 となります。

← 技術ブログ一覧へ戻る