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桁」で表現します。

具体的な変換手順は以下のとおりです。

  1. 文字をUTF-8のバイト列に変換する
  2. 各バイトを16進数に変換する
  3. 先頭に「%」を付ける
文字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エンコードツールで実際に変換を試してみてください。