URLデコード・エンコードの使い方
- デコードするときは、URLや
%E6%9D%B1%E4%BA%ACのようなパーセントエンコードされたテキストを貼り付けます。すぐに読める形(この例なら「東京」)が表示されます。 - URL全体を貼り付けると、プロトコル、ホスト(日本語ドメインはUnicode表記も)、パス、フラグメント、そしてデコードしたクエリパラメータの一覧も表示されます。
- 「+ をスペースとして読む」は、検索URLやフォームから送られたデータではオンのままにします。それ以外のテキストで + を記号として残したいときはオフにします。
- エンコードするときはエンコードを選び、テキストを入力して方式を選びます。クエリの値に入れるなら「URLの一部」がふつうの選択です。
- 結果の横のコピーを押します。正しくない % があれば、何文字目かを示します。
パーセントエンコーディングのしくみ
URLに使える文字は一部の半角英数字と記号だけで、しかも /(パスの区切り)、?(クエリの始まり)、& と =(パラメータの区切り)、#(フラグメント)には役目があります。それ以外の文字や、データとして使う記号は、% と16進数2桁(1バイトの値)で書きます。これがRFC 3986で決められたパーセントエンコーディングです。
半角スペースはバイト値32、16進数で20なので %20 になります。日本語はまずUTF-8のバイト列に変換され、1バイトずつコードになります。ひらがなや漢字はほとんどがUTF-8で3バイトなので、「東」は %E6%9D%B1、「東京」は %E6%9D%B1%E4%BA%AC と、1文字が9文字に増えます。日本語のURLが長くなるのはこのためです。デコードはその逆で、コードをバイトに戻し、UTF-8として読みます。英数字と - . _ ~ はエンコードの必要がなく、16進数は大文字でも小文字でもかまいません。
URLデコードで文字化けするとき:Shift_JIS と EUC-JP
パーセントコードが表しているのは文字ではなくバイトです。同じ日本語でも、どの文字コードでバイトにしたかでURLはまったく違います。現在のWebはUTF-8が標準ですが、古い掲示板やショッピングサイト、Windowsの古い業務システムなどには、Shift_JIS や EUC-JP でエンコードしたURLが今も残っています。多くのURLデコーダーはUTF-8しか想定していないため、こうしたURLを入れると「�」だらけになります。
このツールは、まずUTF-8として読み、正しくなければ Shift_JIS、次に EUC-JP として読み直します。どれで読んだかは結果の文字コードの行に表示されます。次の表はこのツールのコードで実際にデコードした結果です(バイト列はPythonの文字コード変換で作成)。
| 文字 | UTF-8 | Shift_JIS | EUC-JP | デコード結果(判定した文字コード) |
|---|---|---|---|---|
| 日本語 | %E6%97%A5%E6%9C%AC%E8%AA%9E | %93%FA%96%7B%8C%EA | %C6%FC%CB%DC%B8%EC | 日本語(Shift_JIS)、日本語(EUC-JP) |
| 東京 | %E6%9D%B1%E4%BA%AC | %93%8C%8B%9E | %C5%EC%B5%FE | 東京(Shift_JIS)、東京(EUC-JP) |
| ラーメン | %E3%83%A9%E3%83%BC%E3%83%A1%E3%83%B3 | %83%89%81%5B%83%81%83%93 | %A5%E9%A1%BC%A5%E1%A5%F3 | ラーメン(Shift_JIS)、ラーメン(EUC-JP) |
| 検索 | %E6%A4%9C%E7%B4%A2 | %8C%9F%8D%F5 | %B8%A1%BA%F7 | 検索(Shift_JIS)、検索(EUC-JP) |
| 渋谷 カフェ | %E6%B8%8B%E8%B0%B7%20%E3%82%AB%E3%83%95%E3%82%A7 | %8Fa%92J%20%83J%83t%83F | %BD%C2%C3%AB%20%A5%AB%A5%D5%A5%A7 | 渋谷 カフェ(Shift_JIS)、スツテォ ・ォ・ユ・ァ(Shift_JIS) |
「渋谷」のShift_JISが %8Fa%92J のように英字まじりなのは、2バイト目が英字と同じ値(0x61は a、0x4A は J)になる文字があり、エンコードする側がそのまま残すことがあるためです。このツールはそうしたURLも正しく読みます。また「ソ」「表」「能」などは2バイト目が 0x5C(バックスラッシュ、日本語環境では ¥)で、昔から「ダメ文字」と呼ばれ、プログラムで文字化けや誤動作の原因になってきました。%83%5C%83t%83g は「ソフト」と正しくデコードされます。
文字化けの見分け方
- 「縺」「繧」「繝」が並ぶ(例:「こんにちは」が「縺薙s縺ォ縺。縺ッ」):UTF-8のテキストをShift_JISとして読んでいます。ひらがなとカタカナのUTF-8が E3 81・E3 82・E3 83 で始まり、それがShift_JISではこの3つの漢字になるためです。元のパーセントコードをここに貼れば正しく読めます。
- 「�」が並ぶ:Shift_JISやEUC-JPのバイトをUTF-8として読んでいます。このツールなら自動で判別します。
- 半角カタカナだらけになる(上の表の「渋谷 カフェ」のEUC-JPが「スツテォ ・ォ・ユ・ァ」になる例):EUC-JPのバイトがShift_JISとしても読めてしまった状態です。EUC-JPの多くのバイトはShift_JISの半角カナと同じ値なので、このツールでも、短い語ではShift_JISと判定することがあります。文字コード欄がShift_JISなのに結果が半角カナばかりなら、元はEUC-JPです。
なお、エンコードは常にUTF-8で行います。Shift_JISでエンコードしたURLが必要なら、プログラム側で文字コードを指定してください(Pythonなら urllib.parse.quote('東京', encoding='shift_jis') で %93%8C%8B%9E)。
encodeURIComponent・encodeURI・フォーム形式の違い
4つの方式は、どの文字をそのまま残すかが違います(表はこのツールで変換した結果)。
| 文字 | URLの一部(encodeURIComponent) | URL全体(encodeURI) | フォームデータ | RFC 3986 厳密 | |
|---|---|---|---|---|---|
| 半角スペース | %20 | %20 | + | %20 |
| (全角スペース) | 全角スペース | %E3%80%80 | %E3%80%80 | %E3%80%80 | %E3%80%80 |
# | シャープ | %23 | # | %23 | %23 |
% | パーセント | %25 | %25 | %25 | %25 |
& | アンパサンド | %26 | & | %26 | %26 |
+ | プラス | %2B | + | %2B | %2B |
/ | スラッシュ | %2F | / | %2F | %2F |
= | イコール | %3D | = | %3D | %3D |
? | 疑問符 | %3F | ? | %3F | %3F |
! | 感嘆符 | ! | ! | %21 | %21 |
~ | チルダ | ~ | ~ | %7E | ~ |
あ | ひらがな | %E3%81%82 | %E3%81%82 | %E3%81%82 | %E3%81%82 |
東 | 漢字 | %E6%9D%B1 | %E6%9D%B1 | %E6%9D%B1 | %E6%9D%B1 |
ア | 半角カナ | %EF%BD%B1 | %EF%BD%B1 | %EF%BD%B1 | %EF%BD%B1 |
😀 | 絵文字 | %F0%9F%98%80 | %F0%9F%98%80 | %F0%9F%98%80 | %F0%9F%98%80 |
- URLの一部はJavaScriptの
encodeURIComponentです。URLで意味を持つ記号もすべてエンコードするので、クエリの値1つやパスの1区間に安全に入れられます。別のURLの中にURLを入れるときもこれです。 - URL全体は
encodeURIです。; , / ? : @ & = + $ #を残すので、完成したURLがリンクとして使えるまま、日本語やスペースだけがエンコードされます。&を含むかもしれない値1つには使わないでください。 - フォームデータはブラウザがフォームを送る形式(
application/x-www-form-urlencoded)で、スペースが+になり、! ' ( ) ~もエンコードされます。 - RFC 3986 厳密は encodeURIComponent に加えて
! ' ( ) *もエンコードします。OAuthの署名など、一部のAPIが求める形式です。
全角スペースは記号に見えても普通の文字なので、UTF-8の3バイト %E3%80%80 になります。検索キーワードの区切りに全角スペースを使うと、半角スペース(%20 や +)とは別物として送られます。
+ と %20 の違い・二重エンコード
どちらもスペースを表しますが、+ がスペースになるのはクエリ文字列の中だけです。フォーム形式ではスペースを + と書くので、検索サイトのURLは ?q=東京+ラーメン のようになります。RFC 3986では %20 と書き、パスの中の + はただのプラス記号です。値としてプラス記号を送るときは %2B にします。そのため C%2B%2B は「C++」にデコードされます。
エンコード済みのテキストをもう一度エンコードすると、% が %25 になります。スペースは %20、さらに %2520 となります。リダイレクト用のリンクや計測用のパラメータなど、2つのシステムを通るURLでよく起こります。このツールはパーセントコードが残っているあいだデコードを繰り返し、何重だったかを表示します。a%252520b は3重で、「a b」になります。1段ずつ戻したいときはオプションをオフにします。
計算例:検索URLを読む
入力欄のサンプルは、ある検索ページのURLです:https://www.example.jp/search?q=%E6%9D%B1%E4%BA%AC+%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%B3&page=2&ref=%2Ftop%3Flang%3Dja#results。パーセントコードは21個、エンコードは1重です。デコードすると次のようになります。
https://www.example.jp/search?q=東京 ラーメン&page=2&ref=/top?lang=ja#results
ホストは www.example.jp、パスは /search です。クエリパラメータの表には3個のパラメータが並びます:q =「東京 ラーメン」、page =「2」、ref =「/top?lang=ja」。「東京」は6バイト、「ラーメン」は12バイトで、あいだの + はスペースになりました。最後の値はそれ自体がクエリ付きのパスなので、/、?、= がエンコードされています。そのままだと = の位置でパラメータが途中で切れてしまうからです。フラグメント #results はサーバーには送られません。
日本語ドメイン(Punycode)
「日本語.jp」のような日本語ドメイン名は、xn-- で始まるPunycode(RFC 3492)という英数字の形で通信されます。「日本語.jp」は xn--wgv71a119e.jp、IANAのテスト用ドメイン「例え.テスト」は xn--r8jz45g.xn--zckzah です。どちらの形を貼り付けても、ブラウザが送る形とUnicode表記の両方を表示します。Punycodeはパーセントエンコーディングとは別物なので、ドメイン名を % で書くことはありません。
ヒントと制限
- クエリの値は1つずつエンコードしてから
&と=でつなぎます。完成したクエリ文字列をまとめてencodeURIComponentにかけると、区切りの記号までエンコードされてしまいます。 - パーセントエンコーディングは暗号化ではありません。誰でもデコードできるので、パスワードやトークンを含むURLを共有しないでください。
- % のあとに16進数が2桁続かない「50%オフ」のような文字はデコードできず、何文字目かをお知らせします。% そのものは
%25です。 - URLの中の日本語を正規表現で抜き出すなら正規表現チェッカー、URLを読み取れる形にするならQRコード作成が使えます。
デコードとエンコードはブラウザの中で行われ、貼り付けた内容はアップロードも保存もされません。再読み込みすると消えます。URLにはセッションIDや個人情報が含まれることも多いので、この点は大切です。
よくある質問
URLの %E3%81%82 のような文字は何ですか?
パーセントエンコードされた日本語です。%E3%81%82 はひらがなの「あ」をUTF-8にした3バイト(E3 81 82)です。URLを貼り付ければ、すべてのコードを読める文字に戻します。
URLデコードすると文字化けします。
元のURLがUTF-8ではなくShift_JISかEUC-JPでエンコードされている可能性が高いです。このツールはUTF-8として読めなければShift_JIS、EUC-JPの順に読み直し、使った文字コードを表示します。結果が半角カタカナばかりなら、元はEUC-JPです。
%20 と + の違いは何ですか?
どちらもスペースです。ただし + がスペースになるのはクエリ文字列(? のあと)とフォームデータの中だけで、パスの中では + はプラス記号です。プラス記号そのものを送るときは %2B と書きます。
encodeURI と encodeURIComponent はどう使い分けますか?
encodeURI はURL全体に使い、/ ? & = # などURLの構造を作る記号を残します。encodeURIComponent はクエリの値1つやパスの1区間に使い、それらの記号もエンコードするので、周りのURLを壊しません。
URLに %2520 が入っているのはなぜですか?
二重にエンコードされています。1回目でスペースが %20 になり、2回目で % が %25 になりました。このツールは重なりを検出して、すべて元に戻します。
貼り付けたURLはどこかに送られますか?
いいえ。デコードとエンコードはブラウザのJavaScriptで行い、サーバーには何も送りません。貼り付けた内容も保存しません。
最終更新日:2026年10月16日