URL エンコード・デコード・解析

URL をエンコード・デコードし、各部分に分解します。

このツールについて

URL で使えるようにテキストをパーセントエンコードしたり、デコードして戻したり、完全な URL をプロトコル、ホスト、パス、クエリパラメーター、フラグメントに分解したりできます(パラメーターはすべてデコード済み)。

使い方

  1. リンクを各部分に分解するなら「URL を解析」、パーセントエンコーディングなら「エンコード / デコード」を選びます。
  2. URL またはテキストを貼り付けます。
  3. 「解析」モードでは、プロトコル、ホスト、パス、すべてのクエリパラメーターをデコード済みの状態で確認できます。
  4. 必要な部分をコピーします。

よくある質問

encodeURI と encodeURIComponent の違いは何ですか?
encodeURIComponent は / ? & = など URL で意味を持つ文字をすべてエスケープするため、単一のパラメーター値に使います。encodeURI はそれらの文字を残すため、URL 全体がそのまま使えます。「保持」オプションで両者を切り替えられます。
スペースが + になったり %20 になったりするのはなぜですか?
HTML フォームのクエリ文字列ではスペースは + と書かれ、URL のそれ以外の部分では %20 になります。フォームデータをデコードするときは「+ をスペースとして扱う」をオンにしてください。
「壊れたパーセントエスケープ」とはどういう意味ですか?
% の後には 16 進数 2 桁が必要で、マルチバイト文字にはすべてのバイトが必要です。%E2%82 のようにエスケープの途中で切れたテキストはデコードできません。
URL のパスはクエリと違う方法でエンコードすべきですか?
ほとんど同じ規則が適用されますが、違いが 2 つあります。パスでは / がセグメントを区切るため、各セグメントを個別にエンコードし、名前の中のスラッシュは %2F になります。また、パスでは + は文字どおりのプラスですが、フォームエンコードされたクエリ文字列ではスペースとして読まれます。
URL の長さに上限はありますか?
標準では上限は定められていませんが、実用上の上限はあります。ブラウザーは非常に長い URL も扱えますが、サーバー、プロキシ、CDN はリクエスト行を 8 KB 程度に制限していることが多く、414 URI Too Long を返します。URL は約 2,000 文字以内に抑え、大きなデータは POST のボディで送ってください。
トークンやメールアドレスを URL に入れても安全ですか?
避けてください。URL は、サーバーのログ、プロキシのログ、ブラウザーの履歴、他のサイトに送られる Referer ヘッダーに残ります。パーセントエンコードは誰でもデコードできるため、何も隠せません。トークンは Authorization ヘッダーで、個人データは POST のボディで送ってください。

URL エンコード(パーセントエンコーディング)とは?

URL エンコード、つまりパーセントエンコーディングは、URL で使えない文字や特別な意味を持つ文字を、% 記号と 2 桁の 16 進数に置き換えます。スペースは %20、& は %26、/ は %2F になります。規則は RFC 3986 に由来し、エンコードが一切不要な非予約文字として、ASCII の英字、数字、- . _ ~ が挙げられています。それ以外の文字は、URL のどの部分に現れるかによってエスケープが必要になる場合があります。

ASCII 以外のテキストは、まず UTF-8 のバイト列に変換され、各バイトが個別にエンコードされます。そのため「é」は %C3%A9 になり、ロケットの絵文字は %F0%9F%9A%80 の 4 つのエスケープになります。デコードするときは、1 文字分のバイトがすべて揃っている必要があります。このツールはブラウザー標準の encodeURIComponent、encodeURI、decodeURIComponent 関数を使うため、URL エンコードとデコードの結果は JavaScript のコードが出力するものと一致します。

URL を解析してクエリパラメーターを読み取る方法

「URL を解析」モードは、リンクを URL 標準で定められた構成要素に分割します。プロトコル、ユーザー名、ホスト、ポート、パス、クエリ、フラグメント、オリジンで、それぞれにコピーボタンがあります。クエリ文字列は名前と値のペアに分解され、各値はデコードされるため、?q=running%20shoes は running shoes と表示されます。color=black&color=white のように同じパラメーターが複数回現れる場合は、それぞれが別の行になります。

パーサーにはスキームを含む完全な URL が必要なので、example.com/path は失敗し、https://example.com/path なら成功します。URL に含まれるパスワードは、構成要素の表ではマスクされます。コードでは、ブラウザーと Node.js なら new URL(link) と url.searchParams、Python なら urllib.parse で同じ解析ができます。リンクが curl コマンドから来たものなら、curl コマンドの作成・変換ツールでリクエスト全体を fetch や Python に変換できます。

URL が壊れるのはなぜ? よくあるエンコードの間違い

典型的なバグは、生の値を連結して URL を組み立てることです。R&D のような検索語を ?q=R&D として送ると、q=R と、D という名前の空の 2 つ目のパラメーターになってしまいます。各値を encodeURIComponent で個別にエンコードするか、URLSearchParams にクエリ文字列を組み立てさせてください。URL 全体を encodeURIComponent に通してはいけません。URL が機能するために必要なコロンやスラッシュまでエスケープされてしまいます。

逆のバグが二重エンコードです。2 回エンコードされた値では % が %25 になるため、スペースは %2520 になり、1 回デコードしてもまだ %20 のままです。URL に %25 が含まれていたら、1 回デコードして、結果にまだエスケープが含まれていないか確認してください。プラス記号にも注意が必要です。クエリ文字列では + がスペースとして読まれることが多いため、文字どおりの + は %2B とエンコードしてください。

うまく動かない、または結果がおかしいですか? このツールの問題を報告