URL をエンコード・デコードする方法

· 7 分で読めます

URLでスペースがあるべきところに%20を見たり、アクセント付き文字があるべきところに%C3%A9を見たことがあるなら、それがURLエンコーディングです。これはWebの動作の基本的な部分であり、これを理解することで壊れたリンク、APIの問題、フォーム送信のデバッグに役立ちます。ブラウザベースのエンコーダーは、データをサーバーにアップロードせずに、作業全体をローカルで処理します。

URLエンコーディングがすること

URLには安全に使える文字が限られています。文字(A-Z、a-z)、数字(0-9)、いくつかの特殊文字(-、_、.、~)です。それ以外のすべて(スペース、アクセント付き文字、絵文字、&、=、#、?などの記号)は安全な形式に変換する必要があります。

URLエンコーディング(パーセントエンコーディングとも呼ばれる)は、安全でない文字を%の後に16進数のバイト値を続けた形に置き換えます:

文字エンコード後
スペース%20
&%26
=%3D
#%23
?%3F
/%2F
@%40
:%3A
+%2B
,%2C
;%3B
(改行)%0A
(タブ)%09

URLエンコーディングが必要なとき

エンコードとデコードの手順

  1. エンコードかデコードを選ぶ: 方向を選択します。クエリパラメーターにはencodeURIComponent、完全なURLにはencodeURIを選びます。
  2. 入力を貼り付け: テキストまたはURLを入力します。結果は即座に更新されます。
  3. 出力をコピー: 結果をコード、APIリクエスト、ブラウザで使います。

URLエンコーディングの簡単な歴史

URLエンコーディングは1994年12月に、元のURL仕様とともにRFC 1738で定義されました。RFCはWebの発明者であるTim Berners-Leeが、IETF URI Working Groupからの入力を受けて執筆しました。元のエンコーディングスキームはASCIIバイト値を使い、すべての予約文字または安全でない文字は%の後に16進数2桁を続ける形でエンコードされました。

エンコーディングは何度か更新されました:

最大の変更はRFC 3986でのUTF-8への移行でした。それ以前は、エンコードされたURLはASCIIのみで、非ラテン文字には回避策(ドメインにはPunycode、国際アドレスにはIDN)が必要でした。今日、URL内のアクセント付き「é」は%C3%A9(その2つのUTF-8バイト)にエンコードされ、古いシステムが生成したであろうLatin-1バイト%E9ではありません。

encodeURI vs encodeURIComponent

JavaScriptには微妙に異なる動作を持つ3つのエンコーディング関数があります:

関数エンコードするもの保持するもの用途
encodeURI()すべての安全でない文字URL構文: : / ? & = #URL全体のエンコード
encodeURIComponent()URL構文を含むすべての安全でない文字A-Z a-z 0-9 - _ . ~ ! * ' ( ) のみクエリパラメーター値
escape()(非推奨)ほとんどの安全でない文字Latin-1のみ使わない

Pythonでは:

他の言語では:

言語コンポーネントエンコーディング完全なURIエンコーディング
JavaURLEncoder.encode()(+に関する注意あり)URI.toASCIIString()
C#Uri.EscapeDataStringUri.EscapeUriString
RubyCGI.escape()URI.encode_www_form_component
PHPrawurlencode()urlencode()(注意: %2B vs +)
Gourl.QueryEscape()url.PathEscape()
Rustpercent_encodingクレートpercent_encodingクレート

よくある落とし穴

具体例

入力encodeURIencodeURIComponent
hello worldhello%20worldhello%20world
q=test&page=1q=test&page=1q%3Dtest%26page%3D1
https://x.com/pathhttps://x.com/pathhttps%3A%2F%2Fx.com%2Fpath
caf écaf%20%C3%A9caf%20%C3%A9
中文%E4%B8%AD%E6%96%87%E4%B8%AD%E6%96%87
100%100%25100%25
email@test.comemail@test.comemail%40test.com

使いこなしのヒント

プライバシーと機密URL

URLエンコーダーとデコーダーは完全にブラウザ内で動作します。貼り付けたURL、中間処理、エンコード/デコードされた出力はすべてデバイス上に留まります。サーバーへのアップロード、ロギング、第三者との共有は一切ありません。

これはURLが極めて機密性の高いデータを含むことが多いからです。クエリパラメーター内のAPIキーとトークン、アカウントアクセスを付与するOAuth認可コード、セッションID、埋め込み認証情報を持つプライベートS3バケットの署名付きURL、マジックリンクのログイントークン、パスワードリセットURL、製品構造を明かす内部管理URL、購読解除リンクの顧客メールアドレス、フォーム送信の個人データなど。クラウド型のURLエンコーダーはすべての貼り付けをログに記録し、ときには「サービス改善」のために保持し、貼り付けられた認証トークンがログを監視する攻撃者によって抽出された実際の漏洩に関与してきました。ブラウザベースのエンコーダーは露出ゼロで、URLはマシンを離れません。

ブラウザベースのエンコーディングは、ページを一度読み込めばオフラインでも動作するため、飛行機の中、インターネットアクセスのないセキュアな環境、または認証情報を持つURLを第三者のサービスに貼り付けてはいけない場所でURLをエンコードするのに役立ちます。

よくある質問

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

encodeURI は URL 構造内の有効な文字(スラッシュ、コロン、クエスチョンマーク)を保持します。encodeURIComponent は文字、数字、いくつかの安全な文字以外をすべてエンコードします。クエリパラメータの値には encodeURIComponent、URL 全体には encodeURI を使ってください。

なぜスペースが %20 になったり + になったりするのですか?

URL エンコーディングではスペースは %20 になります。フォームデータ(application/x-www-form-urlencoded)ではスペースは + になります。それぞれの文脈ではどちらも有効ですが、%20 は URL の汎用的な標準です。

URL を手動でエンコードする必要がありますか?

ほとんどの場合、使用言語やフレームワークが自動的にエンコードしてくれます。手動エンコードが役立つのは、URL を手作業で組み立てるとき、API リクエストをデバッグするとき、特殊文字を含むクエリ文字列を扱うときです。

データはサーバーに送信されますか?

いいえ。すべてのエンコードとデコードはブラウザ内で行われます。