本文へスキップ

URLエンコーダー・デコーダー

URLやクエリ文字列をパーセントエンコード・デコードします。値ひとつ(encodeURIComponent)とURL全体(encodeURI)の方式を選べ、完全なURLをプロトコル・ホスト・パス・クエリパラメータに分けて確認できます。

方向
0文字 · 0行
エンコード方式
encodeURIComponentは /, ?, &, # のようなURLの区切り文字も含めてすべてエスケープするため、クエリパラメータの値ひとつをエンコードするのに使います。encodeURIはこれらの区切り文字はそのままにし、それ以外だけをエスケープするため、URL全体を扱うのに使います。例:「a b/c?d」→ 値ひとつは「a%20b%2Fc%3Fd」、URL全体は「a%20b/c?d」。

0文字 · 0行

URL構造の分析

URL構造の分析

完全なURLを入力すると、プロトコル・ホスト・パス・クエリパラメータに分けて表示します。

https://example.com/path?query=1&lang=ko

入力した内容はこのブラウザの中だけで処理され、サーバーには送信されません。 仕組みを見る

hello worldとhello%20worldを相互変換するURLエンコード・デコード

使い方

このページにはツールが2つあります。上側は文字列をエンコード・デコードし、下側の「URL構造の分析」は完全なURLを1つ、部分ごとに分けて表示します。2つは互いに影響しません。

上側では、「方向」で「エンコード」か「デコード」を選んだあと、次の2つを決めます。

  • 「エンコード方式」:「値ひとつ」はクエリパラメータの値のようにURLへ差し込む断片に、「URL全体」はすでにアドレスの形になっている文字列に使います。違いは次のセクションで説明します。
  • 「+ を空白として扱う(application/x-www-form-urlencoded)」:HTMLフォームが送るデータを扱うときだけオンにします。

エンコードでは「元のテキスト」に入れた文字列が「エンコード結果」に、デコードでは「エンコードされた文字列」が「デコード結果」に出ます。€ をエンコードすると %E2%82%AC です。この文字はUTF-8で3バイトなので、%XX が3つ並びます。「結果をデコード入力へ」「結果をエンコード入力へ」は、いま出た結果を逆方向の入力へ移します。

「値ひとつ」と「URL全体」では、残す文字が違います

どちらの方式も、URLにそのまま書けない文字を % と16進数2桁に置き換えます(パーセントエンコーディング)。違うのは、/、?、& のようにURLの構造を区切る文字の扱いです。「値ひとつ」はJavaScriptの encodeURIComponent、「URL全体」は encodeURI と同じ結果になります。

エンコード方式 変換せずに残す文字
値ひとつ 英字、数字、- _ . ! ~ * ' ( )
URL全体 上の文字すべてと ; / ? : @ & = + $ , #

同じ入力 https://example.com/café?q=crème brûlée&page=1#menü を2つの方式でエンコードすると、次のように分かれます。

  • URL全体:https://example.com/caf%C3%A9?q=cr%C3%A8me%20br%C3%BBl%C3%A9e&page=1#men%C3%BC
  • 値ひとつ:https%3A%2F%2Fexample.com%2Fcaf%C3%A9%3Fq%3Dcr%C3%A8me%20br%C3%BBl%C3%A9e%26page%3D1%23men%C3%BC

1つ目はそのままアドレスとして使えます。2つ目はアドレスとしては使えませんが、別のURLのパラメータの値(?redirect=...)へ丸ごと入れられます。反対に、検索語 a/b&c をクエリの値に入れるときに「URL全体」を使うと、& がそのまま残り、次のパラメータの始まりと読まれてしまいます。この場合は「値ひとつ」で a%2Fb%26c を作らなければなりません。

デコードにも同じ違いがあります。「URL全体」でデコードすると、構造を区切る文字のエンコードは解きません。a%2Fb%3Fc%26d%23e%20f を入れると、「値ひとつ」は a/b?c&d#e f を、「URL全体」は a%2Fb%3Fc%26d%23e f を返します。デコードしたのに %2F や %26 が残っているなら、エンコード方式を「値ひとつ」に変えてみてください。

「値ひとつ」でも ! ' ( ) * は変換されない点には気をつけてください。これらの文字までエンコードするよう求めるサーバーに送る値なら、結果を自分で %21、%27、%28、%29、%2A に書き換える必要があります。

+ を空白として扱う

HTMLの <form> が送るデータ(application/x-www-form-urlencoded)は、空白を %20 ではなく + で書きます。この形式を作ったり読んだりするときに、「+ を空白として扱う」をオンにします。

方向 入力 オプションがオフ オプションがオン
エンコード(値ひとつ) a+b c a%2Bb%20c a%2Bb+c
エンコード(URL全体) a+b c a+b%20c a%2Bb+c
デコード(値ひとつ) a+b%2Bc a+b+c a b+c

オプションをオンにすると、原文にあった + は空白と区別できるように %2B になります。「URL全体」の方式はふだん + をそのまま残しますが、このオプションがオンのときは同じく %2B に変えます。オプションがオフのデコードでは、+ はただの + です。検索結果のアドレスからコピーした q=crème+brûlée のような値をデコードして + が残ったなら、このオプションをオンにしてやり直してください。URLのパスやファイル名では + は空白を意味しないので、オフにしておいてください。

「URL構造の分析」に表示される値

「完全なURL」の欄に、https:// のようにプロトコルから始まる完全なURLを入れると、「プロトコル」「ホスト」「パス」が表示され、ある場合だけ「クエリ文字列」と「ハッシュ」が加わります。その下の表には、クエリパラメータが「キー」と「値(デコード済み)」で1行ずつ並びます。example.com/path のようにプロトコルがないと、「プロトコル(https:// など)を含む完全なURLではありません。」と表示されます。

表示されるのは入力した文字そのままではなく、ブラウザがURLを解釈して整えた値です。https://Example.COM:443/a/../b/café?q=hello%20world&tag=a&tag=b&x=1+2#top を入れると、次のようになります。

項目 表示される値 入力から変わった点
プロトコル https
ホスト example.com 小文字になり、httpsの既定のポート443は省かれます
パス /b/caf%C3%A9 /a/.. が整理され、é はエンコードされた形で出ます
クエリ文字列 ?q=hello%20world&tag=a&tag=b&x=1+2 入力のまま
ハッシュ #top

表には q = hello world、tag = a、tag = b、x = 1 2 の4行が出ます。同じキーが何度も出てくれば、行もその数だけになります。x の値からわかるように、この表は上側の「+ を空白として扱う」チェックボックスに関係なく、+ を常に空白として読みます。クエリ文字列はフォームデータの形式として解釈する、というのがURL標準の決まりだからです。

補足が2つあります。ASCII以外の文字を含むドメインは「ホスト」にPunycodeで表示されます(https://café.example/ → xn--caf-dma.example)。また、http://user:pw@host:8080/p のようにアドレスにIDとパスワードが入っていると、その部分はどの項目にも表示されず、「ホスト」には host:8080 だけが出ます。

デコードに失敗する入力

デコードが成功するのは、% のあとに16進数が2桁続き、そうして集まったバイトがUTF-8の文字として成り立つときだけです。ひとつでも外れると、結果は出ずに「パーセント(%)エンコーディングが正しくありません。」で始まる案内が表示されます。

入力 失敗する理由
100% % のあとに何もありません。パーセント記号そのものは %25 と書く必要があります
%zz zz は16進数ではありません
%E2%82 3バイトで1文字になる €(%E2%82%AC)の、最後の1バイトが欠けています。長いアドレスを途中で切ってコピーしたときに起こります

エンコードのほうは失敗しません。片割れだけ残った絵文字のように、それだけでは文字にならない入力も、エラーにせず置換文字(%EF%BF%BD)としてエンコードします。

参考資料

よくある質問

すでにエンコードされた文字列を、もう一度エンコードするとどうなりますか?

% がさらに %25 に変わり、二重エンコードになります。%20 を値ひとつの方式でエンコードすると %2520 になり、これを1回デコードしても空白ではなく %20 が出てきます。アドレスに %25 がいくつも見えたり、デコード結果に %XX がそのまま残っていたりするなら、どこかで2回エンコードされています。原文が出てくるまでデコードを繰り返せば戻せます。結果をデコード入力へ移すボタンを使えば、続けて作業できます。

古いサイトのアドレスにある caf%E9 のような文字列がデコードできません。

そのアドレスがUTF-8以外の文字エンコーディングで作られているからです。このツールは %XX で書かれたバイトをUTF-8としてだけ解釈し、UTF-8として成り立たないバイトの並びは、パーセントエンコーディングが正しくないというエラーとして扱います。%u00e9 のように %u で始まる古い表記も同じエラーになります。こうした文字列は、このツールでは元に戻せません。

パーセントエンコーディングが壊れたURLを「URL構造の分析」に入れると、エラーになりますか?

なりません。上側のデコードは、誤った % がひとつでもあると全体をエラーにしますが、URL構造の分析は読めるところまで読みます。https://example.com/?q=%zz&r=%E2%82 を入れると、qの値は %zz のまま、rの値は文字化けを表す記号(�)で表示されます。UTF-8として読めないバイトは、この記号で表示されることがあります。値が途中で切れていないか、別の文字コードで書かれていないか確認してください。元の文字列にこの記号自体が含まれていた可能性もあり、表示だけでは原因を断定できません。

最終更新日: