URLエンコーダー/デコーダー

URL・クエリ文字列をパーセントエンコード・デコード

テキストURLエンコード
モード

「+を空白に」がオンのとき、デコード時に '+' は空白に変換されます — 部分エンコードモードは入力全体、URL全体モードはクエリ文字列('?' 以降)部分のみ。Base64トークンなどフォームデータでない文字列ではオフにしてください。URL全体モードはURLの構造を保つため %2B・%26・%2F などの予約文字エスケープをデコードしません。リテラルの '+' が必要な場合は、その値だけを部分エンコードモードでデコードしてください。

URLエンコーダー/デコーダーについて

URLに使える文字は決まっています。空白、日本語、そしてURLの構造を表す ? & = # / などを値として入れるには、%と16進数2桁に置き換える必要があります。これがパーセントエンコーディング(URLエンコード)です。「東京」はUTF-8で6バイトなので %E6%9D%B1%E4%BA%AC になります。

このツールには2つのモードがあります。「部分エンコード」はJavaScriptのencodeURIComponentで、クエリの値など1つの部品をまるごとエンコードします。「URL全体」はencodeURIで、完成したアドレスの構造文字を残してそれ以外だけをエンコードします。

RFC 3986の3種類の文字

URLの文法を定めるRFC 3986は文字を3つに分けます。非予約文字(英字、数字、- . _ ~)はいつでもそのまま使えます。予約文字は構造を示すもので、大きな区切りを表すgen-delims(: / ? # [ ] @)と、区切りの中で使うsub-delims(! $ & ' ( ) * + , ; =)があります。それ以外(空白、日本語、%、"など)は必ずエンコードします。

要点は、予約文字を「構造」として使うときはそのまま、「データ」として使うときはエンコードすることです。検索語が「a&b」なら ?q=a&b は q=a と b の2つのパラメーターと解釈され、?q=a%26b と書いて初めて1つの値として届きます。

encodeURIとencodeURIComponentの違い

encodeURIComponent(部分エンコード)は英数字と - _ . ! ~ * ' ( ) 以外をすべてエンコードします。encodeURI(URL全体)はさらに ; , / ? : @ & = + $ # も残します。アドレス全体を部分エンコードすると https%3A%2F%2F… となってリンクとして使えず、逆にクエリの値をURL全体モードでエンコードすると&や+が残って値が壊れます。

よくある失敗が検索語「C++ & Java」です。アドレス全体をURL全体モードでエンコードすると ?q=C++%20&%20Java となり、サーバーはqを「C 」(+が空白になる)と読み、残りを別のパラメーターとして扱います。値だけを部分エンコードすれば C%2B%2B%20%26%20Java で正しく届きます。

encodeURIComponentが残す ! ' ( ) * はRFC 3986ではsub-delimsです。OAuth 1.0の署名のように厳密なRFC 3986準拠が必要な場面では、この5文字も%21 %27 %28 %29 %2Aにしないと署名が合いません。

空白は%20か+か

どちらも正しいのですが、使われる場所が違います。RFC 3986のパーセントエンコーディングでは空白は%20です。+を空白とみなす規則はHTMLフォームの送信形式(application/x-www-form-urlencoded)由来で、ブラウザーがフォームをGETで送るとクエリの空白を+で書きます。URLSearchParamsも同じ規則です。

このツールのエンコードはencodeURIComponentに従うので空白は%20です。デコード時はフォームの規則に合わせて+を空白にします。部分エンコードモードでは入力全体の+を、URL全体モードでは?以降のクエリ部分の+だけを変換し、パス中の+はそのまま残します。Base64トークンなどフォームデータでない文字列をデコードするときは「+を空白に」をオフにすると、+がそのまま残ります。

デコードに失敗するとき

%の後に16進数2桁がない(例:「100%」)か、バイト列が正しいUTF-8にならないとエラーになります。古い日本語サイトのShift_JISでエンコードされたURLが典型で、「日本」はShift_JISでは %93%FA%96%7B ですが、UTF-8としては解釈できないので、このツールはレガシーエンコーディングの可能性を知らせ、EUC-KR・Shift_JISで解釈した候補(Shift_JIS: 日本)をエラーの下に表示します。また、エンコード済みの文字列をもう一度エンコードすると%が%25になり、a%20bがa%2520bになります。

例

クエリの値1つ(部分エンコード)

入力
a b&c=d
結果
a%20b%26c%3Dd

&と=もエンコードされ、1つの値のまま届きます。URL全体モードなら a%20b&c=d となりパラメーターが2つに割れます。

日本語を含むアドレス(URL全体)

入力
https://example.com/search?q=東京&lang=ja
結果
https://example.com/search?q=%E6%9D%B1%E4%BA%AC&lang=ja

構造文字は残り、漢字だけが1文字3バイトずつエンコードされます。

+と空白

入力
a+b%2Bc(部分モードでデコード)
結果
a b+c

そのままの+はフォーム規則で空白になり、%2Bと書かれたものだけがプラス記号に戻ります。

二重エンコード

入力
a%20b(エンコード)
結果
a%2520b

%自体が%25になります。エンコード済みの値は再エンコードしないでください。

使い方

  1. 値やパスの一部なら「部分エンコード」、完成したアドレスなら「URL全体」を選びます。
  2. エンコードするテキスト、またはデコードする%文字列を貼り付けます。
  3. 切り替えボタンで結果を戻し、元の文字列と一致するか確かめます。

よくある質問

日本語のURLをコピーすると%E6%…になるのはなぜ?

アドレスバーは読みやすく日本語で表示しますが、実際に送られるURLはUTF-8をパーセントエンコードした形で、コピーするとその形が貼り付けられます。このツールでデコードすれば日本語に戻せます。

デコードするとエラーになります。

「形式が正しくない」なら%の後に16進数2桁がありません。「UTF-8として解釈できない」なら、Shift_JISなどUTF-8以外でエンコードされたURLの可能性が高いです。その場合はEUC-KR・Shift_JISで解釈した候補も表示するので、意味の通る方を選んでください。

URL全体モードで%2Bが+に戻りません。

URL全体モードが使うdecodeURIは、構造が変わらないよう予約文字(+ & = ? #など)のエスケープをそのまま残します。値だけを部分エンコードモードでデコードしてください。

出典

基準日:

プライバシーとデータの扱い