URLエンコーディングとは?なぜ必要なのか

URLエンコーディングは、パーセントエンコーディングとも呼ばれ、URL内で情報をエンコードするための基本的なメカニズムです。Webアドレスに %20%3F を見たことがあれば、URLエンコーディングの実例に遭遇したことになります。

URLエンコーディングが存在する理由

URL(Uniform Resource Locator)は、インターネットの初期に厳格な制限を持って設計されました。URLには、ASCII文字セットから特定の文字のみを含めることができます:

  • 文字: A-Za-z
  • 数字: 0-9
  • 安全な文字: -_.~

しかし問題があります:Webアプリケーションは、スペース、特殊記号、あらゆる人間の言語の文字を含む、あらゆる種類のデータをURL経由で送信する必要があります。URLエンコーディングはこの課題を解決します。

URLエンコーディングが解決する問題

予約文字には特別な意味がある

URL内の特定の文字には特定の目的があります:

文字目的
?クエリ文字列を開始example.com/search?q=test
&パラメータを区切る?name=John&age=25
=パラメータに値を割り当てる?key=value
#フラグメントを示すexample.com/page#section
/パスセグメントを区切るexample.com/blog/post
:プロトコル/ポートを区切るhttps://example.com:8080

エンコーディングなしで何が起こるか?

「Tom & Jerry」を検索したいとします:

❌ 間違い: example.com/search?q=Tom & Jerry

ブラウザは & をパラメータ区切り文字として解釈し、これは2つのパラメータになります:

  • q=Tom (不完全!)
  • Jerry (これは何?)

エンコーディングを使用:

✅ 正しい: example.com/search?q=Tom%20%26%20Jerry

これで明確になりました:1つのパラメータ q で値は「Tom & Jerry」です。

国際文字はASCIIではない

元のASCII文字セットには以下が含まれていません:

  • 中国語の文字: 中文
  • アラビア文字: العربية
  • 絵文字: 😀
  • アクセント付き文字: café、naïve

URLエンコーディングにより、これらすべての文字が送信可能になります。

URLエンコーディングの仕組み

エンコーディングプロセスは簡単なルールに従います:

特殊文字を % とその後に続く文字の値を表す2桁の16進数に置き換える。

一般的な文字エンコーディング

文字名前エンコード後エンコードされる理由
スペース%20スペースは許可されていない
!エクスクラメーション%21一部のシステムと干渉する可能性がある
#ハッシュ%23URLフラグメントをマークする
$ドル%24将来の使用のために予約されている
%パーセント%25エンコーディング指示子自体!
&アンパサンド%26パラメータ区切り文字
+プラス%2B一部のコンテキストでスペースを意味することがある
=イコール%3Dキー値区切り文字
?クエスチョンマーク%3Fクエリ文字列開始
@アット%40ユーザー情報区切り文字

16進数の仕組み

各文字にはASCIIコードがあります。16進数(基数16)表現により、エンコーディングがコンパクトになります:

スペース文字:
- ASCIIコード: 32(10進数)
- 16進数: 20
- エンコード後: %20

アンパサンド (&):
- ASCIIコード: 38(10進数)
- 16進数: 26
- エンコード後: %26

UTF-8と国際文字

ASCII以外の文字(基本的に英語以外のすべて)の場合、URLエンコーディングはUTF-8を使用します:

  1. 文字をUTF-8バイトに変換する
  2. 各バイトを %XX としてエンコードする

中国語の文字「中」:

文字: 中
UTF-8バイト: E4 B8 AD(3バイト)
エンコード後: %E4%B8%AD

絵文字「😀」:

文字: 😀
UTF-8バイト: F0 9F 98 80(4バイト)
エンコード後: %F0%9F%98%80

これにより、すべての言語のすべての文字がURL経由で送信可能になります!

実際の使用例

1. 検索クエリ

Googleで何かを検索するとき:

入力内容: "best coffee in tokyo"
URLの内容: ?q=best%20coffee%20in%20tokyo

2. フォーム送信

method="GET"のHTMLフォームはフォームデータをエンコードします:

<form method="GET" action="/search">
  <input name="product" value="women's shoes" />
  <input name="size" value="7" />
</form>

送信先: /search?product=women%27s%20shoes&size=7

3. APIリクエスト

パラメータを使用してRESTful API呼び出しを構築する:

元の形式: /api/users?name=John Doe&[email protected]
エンコード後: /api/users?name=John%20Doe&email=john%40example.com

4. 認証

OAuthリダイレクトURLには、エンコードされたコールバックURLが含まれることがよくあります:

/oauth/authorize?redirect_uri=https%3A%2F%2Fmyapp.com%2Fcallback

5. 共有リンク

ソーシャルメディアの共有ボタンは、共有されるURLをエンコードします:

https://twitter.com/intent/tweet?url=https%3A%2F%2Fexample.com%2Farticle&text=Check%20this%20out%21

いつエンコードするか

常にエンコードする:

✅ クエリパラメータ内のユーザー入力 ✅ 特殊文字を含むフォームデータ ✅ 国際的なテキスト(中国語、アラビア語、絵文字など) ✅ スペースを含むファイルパス ✅ URL内のメールアドレス ✅ URL内のJSONデータ

通常エンコードする必要がないもの:

❌ パス自体(特殊文字がない限り) ❌ ドメイン名 ❌ プロトコル(https://) ❌ 制御下の標準的な句読点

URLをエンコードする方法

JavaScript

// パラメータ値用(最も一般的)
const query = "hello world!";
const encoded = encodeURIComponent(query);
// 結果: "hello%20world%21"

// 完全なURL用
const url = "https://example.com/search?q=hello world";
const encoded = encodeURI(url);
// 結果: "https://example.com/search?q=hello%20world"

Python

from urllib.parse import quote, quote_plus

# 標準エンコーディング
text = "hello world!"
encoded = quote(text)  # 'hello%20world%21'

# プラスエンコーディング(フォームデータ用)
encoded = quote_plus(text)  # 'hello+world%21'

PHP

// パラメータ値用
$query = "hello world!";
$encoded = urlencode($query);  // "hello+world%21"

// 一般的な使用
$encoded = rawurlencode($query);  // "hello%20world%21"

よくある落とし穴

1. ユーザー入力のエンコードを忘れる

// ❌ 危険 - 特殊文字で壊れる
const url = `/search?q=${userInput}`;

// ✅ 安全 - 常にエンコードする
const url = `/search?q=${encodeURIComponent(userInput)}`;

2. 二重エンコーディング

// ❌ 間違い - 2回エンコードする
const text = "hello world";
const encoded = encodeURIComponent(encodeURIComponent(text));
// 結果: "hello%2520world"(壊れている!)

// ✅ 正しい - 1回エンコードする
const encoded = encodeURIComponent(text);
// 結果: "hello%20world"

3. 送信後にデコードしない

// ❌ 間違い - エンコードされたテキストをユーザーに表示
console.log(params.get('name'));  // "John%20Doe"

// ✅ 正しい - 表示用にデコードする
console.log(decodeURIComponent(params.get('name')));  // "John Doe"

ベストプラクティス

  1. ユーザー入力は常にエンコードする - URLに入れる前に
  2. 組み込み関数を使用する - 手動でエンコードしようとしない
  3. 適切な関数を選択する - パラメータには encodeURIComponent()
  4. 読み取り時にデコードする - ユーザーに %20 を表示しない
  5. 特殊文字でテストする - スペース、&=# を含む
  6. 国際的なテキストでテストする - 中国語、アラビア語、絵文字
  7. URL内に機密データを入れない - エンコードされていても見える

URLをテストする

URLエンコーディングを試してみたいですか?これらの無料ツールを試してください:

まとめ

URLエンコーディングは、Web開発のためのシンプルだが不可欠な概念です。これにより以下が保証されます:

  • 特殊文字がURLを壊さない
  • 国際的なテキストが送信できる
  • データがクライアントとサーバー間で安全に流れる
  • URLがすべてのシステムで一貫して機能する

覚えておいてください:疑わしい場合は、エンコードしましょう! URLも(そしてユーザーも)感謝するでしょう。


無料URLエンコーダーを試してURLを即座にエンコードするか、URLデコーダーを使用してパーセントエンコードされた文字列をデコードしましょう!