Webブラウザのアドレスバーに日本語を含むURLを入力したとき、「%E3%81%82」のような見慣れない文字列に変換されたことはありませんか?これが「URLエンコード(パーセントエンコーディング)」です。Web開発やAPI連携では必須の知識であるURLエンコードについて、基礎からわかりやすく解説します。
URLエンコードとは
URLエンコードとは、URLに使用できない文字や特殊な意味を持つ文字を「%XX」という形式に変換する仕組みです。正式にはパーセントエンコーディング(Percent-Encoding)と呼ばれます。
URLには使える文字が決まっており、半角英数字と一部の記号(-、_、.、~)のみがそのまま使用できます。日本語やスペース、その他の記号はそのままURLに含めることができないため、エンコードが必要になります。
なぜURLエンコードが必要なのか
URLエンコードが必要な理由は大きく分けて2つあります。
1. URLの構造を壊さないため
URLには「?」「&」「=」「/」「#」など、特別な意味を持つ文字があります。例えば、検索クエリに「&」が含まれている場合、それがパラメータの区切りなのか検索文字列の一部なのか判別できません。
// "A&B" を検索したい場合
// NG: &がパラメータ区切りと解釈される
https://example.com/search?q=A&B=...
// OK: &をエンコード
https://example.com/search?q=A%26B
2. ASCII以外の文字を使うため
URLの仕様(RFC 3986)では、使用できる文字がASCIIの一部に限定されています。日本語、中国語、アラビア文字などの非ASCII文字は、そのままURLに含めることができません。
// 日本語の "東京" をURLに含める場合
https://example.com/city/東京
↓ エンコード後
https://example.com/city/%E6%9D%B1%E4%BA%AC
%XXの仕組み(パーセントエンコーディング)
パーセントエンコーディングでは、文字をUTF-8でバイト列に変換し、各バイトを「%」+「16進数2桁」で表現します。
具体的な変換手順は以下のとおりです。
- 文字をUTF-8のバイト列に変換する
- 各バイトを16進数に変換する
- 先頭に「%」を付ける
| 文字 | UTF-8バイト列 | URLエンコード |
|---|---|---|
| スペース | 0x20 | %20 |
| あ | 0xE3 0x81 0x82 | %E3%81%82 |
| & | 0x26 | %26 |
| = | 0x3D | %3D |
スペースについては、「%20」の他に「+」で表現される場合もあります(application/x-www-form-urlencoded形式)。
予約文字と非予約文字
URLの文字は「予約文字」と「非予約文字」に分類されます。
非予約文字(エンコード不要):
A-Z a-z 0-9 - _ . ~
予約文字(文脈によりエンコードが必要):
: / ? # [ ] @ ! $ & ' ( ) * + , ; =
予約文字はURL内で特別な役割を持つため、データとして使いたい場合はエンコードが必要です。ただし、URLの構造部分(パスの区切り「/」など)として使う場合はエンコードしません。
encodeURI vs encodeURIComponent
JavaScriptにはURLエンコード用の関数が2つあり、用途が異なります。この違いを理解することが非常に重要です。
encodeURI()
URL全体をエンコードする場合に使います。URL構造に必要な文字(:、/、?、#、&、=など)はエンコードされません。
encodeURI("https://example.com/path?q=東京&lang=ja")
// → "https://example.com/path?q=%E6%9D%B1%E4%BA%AC&lang=ja"
// ://?&= はエンコードされない
encodeURIComponent()
URLのパラメータ値など、URLの一部分をエンコードする場合に使います。予約文字もすべてエンコードされます。
encodeURIComponent("東京&大阪")
// → "%E6%9D%B1%E4%BA%AC%26%E5%A4%A7%E9%98%AA"
// & もエンコードされる
使い分けの原則: URL全体にはencodeURI、パラメータの値にはencodeURIComponentを使いましょう。
UTF-8との関係
現在のWeb標準では、URLエンコードにはUTF-8を使用することが推奨されています(RFC 3986)。かつてはShift_JISやEUC-JPでエンコードするWebサイトもありましたが、現在はほぼUTF-8に統一されています。
注意点として、古いシステムやレガシーな日本語サイトでは異なる文字コードが使われている場合があります。文字化けが発生した場合は、文字コードの不一致を疑ってみてください。
各言語でのURLエンコード
// JavaScript
encodeURIComponent("こんにちは")
# Python
from urllib.parse import quote
quote("こんにちは")
# PHP
urlencode("こんにちは")
# Java
URLEncoder.encode("こんにちは", "UTF-8")
URLエンコード・デコードを試してみましょう
URLエンコードツールを使ってみるまとめ
URLエンコード(パーセントエンコーディング)は、URLに使用できない文字を「%XX」形式に変換する仕組みです。日本語や特殊文字をURLに安全に含めるために不可欠な技術であり、Web開発では必ず理解しておく必要があります。
特にJavaScriptのencodeURIとencodeURIComponentの使い分けは重要です。URL全体にはencodeURI、パラメータ値にはencodeURIComponentと覚えておきましょう。当サイトのURLエンコードツールで実際に変換を試してみてください。