URL エンコードとは? 使い方と注意点
2025-06-14

URL に含める非 ASCII 文字・記号を安全に送信するための仕組み。正しく使えばバグやセキュリティリスクを防げます。
導入
Web 開発において、クエリパラメータやフォーム送信で文字列を URL に含める場面は多くあります。しかし、スペースや日本語、&や=などの記号をそのまま URL に含めると、意図しない分割や文字化けが発生します。本記事では、エンジニアやデータ処理担当者に向けて、URL エンコードの定義・仕組み・実装パターン・注意点を 2000〜3000 文字で網羅します。
概要と基本概念
URL エンコード(Percent-encoding)とは: URL に含めるべきでない文字を「%xx」形式に変換する仕組みです。
主な処理項目は以下:
- 半角スペース →
%20
または+
- 非 ASCII 文字(例:日本語) → UTF-8 バイト列 →
%E3%81%82…
- 制御文字や予約文字(例:&, =, /, ?)→
%26
,%3D
,%2F
,%3F
- ASCII 英数字や
-_.~
はそのまま
※補足:+
は application/x-www-form-urlencoded
においてスペースを表しますが、JavaScript の encodeURIComponent
では +
を %2B
にエンコードし、スペースには %20
を使うため、混同に注意が必要です。
なぜこの仕組みが必要なのか
- 通信の信頼性確保:HTTP リクエスト中の文字列を壊さない
- セキュリティ向上:予期せぬ URL 操作による脆弱性(XSS, Open Redirect)を防ぐ
- 互換性:RFC 3986 や W3C の標準に沿った運用
- 正確な構造解析:サーバ側が期待どおりパラメータを解析できる
主な変換ルール
元文字 | 変換後 | 注意点 |
---|---|---|
スペース | %20 または + |
RFC 依存。アプリによって使い分け |
! * ' ( ) |
%21 %2A %27 %28 %29 |
一部の環境では故意に避けられる |
非 ASCII 文字 | UTF-8 + % 変換 |
多バイト変換となる |
予約文字 :/?#[]@ |
%3A %2F %3F %23 %5B %5D %40 |
URL 構造を壊さないように全エンコード推奨 |
パス区切り / |
%2F (場合に依存) |
パス文字列として使うならそのまま |
ASCII 英数字/記号 -_.~ |
そのまま | 安全に許可された文字 |
※補足:encodeURIComponent
では -_.!~*'()
の一部はエンコードされないことに注意。詳細は MDN を参照。
実際の使用例
JavaScript
const params = { q: "東京 タワー", lang: "ja-JP", special: "a&b=c" };
const query = Object.entries(params)
.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
.join("&");
console.log(query);
Python
from urllib.parse import urlencode, unquote
params = {"q": "東京 タワー", "lang": "ja-JP", "special": "a&b=c"}
query = urlencode(params, encoding="utf-8", doseq=True)
print(query)
curl(CLI)
curl "https://example.com/search?q=$(python3 -c 'import urllib.parse; print(urllib.parse.quote(\"東京 タワー\"))')"
PHP
$params = ["q" => "東京 タワー", "lang" => "ja-JP", "special" => "a&b=c"];
$query = http_build_query($params);
echo $query;
Java
import java.net.URLEncoder;
String encoded = URLEncoder.encode("東京 タワー", "UTF-8");
System.out.println(encoded);
Go
import (
"fmt"
"net/url"
)
params := url.Values{}
params.Add("q", "東京 タワー")
params.Add("lang", "ja-JP")
params.Add("special", "a&b=c")
fmt.Println(params.Encode())
Before / After 比較
// Before
https://example.com/search?q=東京 タワー&special=a&b=c
// After
https://example.com/search?q=%E6%9D%B1%E4%BA%AC%20%E3%82%BF%E3%83%AF%E3%83%BC&special=a%26b%3Dc
→ サーバ側で正しく q="東京 タワー" と special="a&b=c" を受け取れる
開発現場での実務例
- CI/CD パイプライン:エンコード関数の静的解析(ESLint・Flake8 自作プラグインなど)
- ログ分析:URL 形式に合わせてエンコードルールで前処理。BigQuery などで正規化
- API ガテリング:Postman / Swagger 定義やドキュメントで明示的に encode/decode を統一
- Web レビュー:PR 上で「ここは encodeURIComponent ではない?」とレビューチェック
- 自動生成ドキュメント:OpenAPI 出力時に servers や paths を安全な URL 形式に変換
- CI によるルールチェック:lint ツール(eslint-plugin-urlencode など)で PR 検出ルールを整備
よくある質問と注意点
Q1. encodeURI と encodeURIComponent の違いは?
A. encodeURI は URL 全体向け。スラッシュ等をエンコードしない。encodeURIComponent はパラメータ用。予約文字も含めてエンコード。ただし -_.!~*'()
など一部記号はエンコードされない。
Q2. スペースは %20 と + どっち?
A. HTML フォーム送信(application/x-www-form-urlencoded)では +。URL 全体では %20 推奨。統一しないと解析ミスの原因。
Q3. 二重エンコード防止の工夫は?
A. デコード確認(decodeURIComponent)→ エンコード。真偽フラグや API 仕様明記で「× 回 encode」混在を防止。
Q4. 日本語や絵文字は UTF-8 で確実に?
A. 環境依存防ぐため、常に明示 utf-8 を指定。古い環境やライブラリでは latin1 や Shift_JIS の可能性もある点に注意。
Q5. セキュリティの観点で気を付けることは?
A. リダイレクト先やログ吐出時に生 URL 出力すると Open Redirect/XSS。URL パラメータとして出力前に常に escape 処理(encode ≠ sanitize)。
Q6. パフォーマンスに影響ある?
A. 通信量は若干増えるがバッチ処理性、CPU コストとも negligible(UTF-8 平均 3 バイト)。HTTPS との相性なら転送圧縮されやすく、影響は限定的。
Q7. エンコード後の可読性は?
A. 開発者向けログやデバッグでは decodeURIComponent で戻し書式。本番ログはエンコード済で統一して後工程で解析。
Q8. URL に日本語を含めても問題ない?
A. 基本的にエンコードされていれば問題なし。IDN(国際化ドメイン名)は Punycode でエンコードされる。ブラウザや環境により日本語表示に差が出るため注意。
Q9. encodeURIComponent を使う順番や場所の注意点は?
A. テンプレートエンジンや SPA のルーティングで使う際、変数展開後にエンコードしないと意図しない結果に。必ず「最終的に URL に挿入する直前」でエンコードするのが原則。
Q10. decode 時の注意点は?
A. + をスペースと誤解釈するケースあり(例:application/x-www-form-urlencoded)。decode 時は decodeURIComponent
だけでなく replace('+', ' ')
等の補正が必要な場面も。
Q11. REST API の path パラメータにも encodeURIComponent は使うべき?
A. はい。ただし path の構造を壊す /
はエンコードしないよう注意。エスケープ対象はパラメータ中の記号類に限定し、path セグメント単位で encodeURIComponent を使うのが安全。
Q12. エンコード処理はバックエンドとフロントエンドでどちらが責任を持つべき?
A. 原則として「送信する側」が責任を持ちます。フロントエンドで URL を構成する場合はエンコード処理を担い、バックエンドは decode + バリデーションの責務を負う役割分担が一般的です。
まとめ
URL エンコードは、Web・API・データ連携において不可欠な基盤技術。 正しくエンコード・デコードすれば、通信エラー・セキュリティ問題・文字化けと無縁になります。 チーム開発では CI やレビューに取り込むと品質が向上し、ログ分析やドキュメントも安定。 また、REST API の path と query の違いを理解し、正しいエンコード処理を各段階で実行することでバグを予防できます。 今すぐプロジェクトに encodeURIComponent 相当の処理を標準フックに実装してみましょう。
💡 今すぐ URL エンコード を試してみたい方へ
➡️ AutoManager URL エンコードはこちら(無料)