URLエンコーダー/デコーダー
URL・クエリ文字列をパーセントエンコード・デコード
処理中…
0.0
停止していません。計算が終わると結果が表示されます。
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になります。エンコード済みの値は再エンコードしないでください。
使い方
- 値やパスの一部なら「部分エンコード」、完成したアドレスなら「URL全体」を選びます。
- エンコードするテキスト、またはデコードする%文字列を貼り付けます。
- 切り替えボタンで結果を戻し、元の文字列と一致するか確かめます。
よくある質問
日本語のURLをコピーすると%E6%…になるのはなぜ?
アドレスバーは読みやすく日本語で表示しますが、実際に送られるURLはUTF-8をパーセントエンコードした形で、コピーするとその形が貼り付けられます。このツールでデコードすれば日本語に戻せます。
デコードするとエラーになります。
「形式が正しくない」なら%の後に16進数2桁がありません。「UTF-8として解釈できない」なら、Shift_JISなどUTF-8以外でエンコードされたURLの可能性が高いです。その場合はEUC-KR・Shift_JISで解釈した候補も表示するので、意味の通る方を選んでください。
URL全体モードで%2Bが+に戻りません。
URL全体モードが使うdecodeURIは、構造が変わらないよう予約文字(+ & = ? #など)のエスケープをそのまま残します。値だけを部分エンコードモードでデコードしてください。
出典
- RFC 3986 — Uniform Resource Identifier (URI): Generic Syntax
- WHATWG URL Standard — application/x-www-form-urlencoded
- MDN — encodeURIComponent()
- MDN — encodeURI()
基準日: