URLエンコード・デコード

URLやクエリ文字列の値をオンラインでエンコード・デコード(パーセントエンコーディング)できます。URLのクエリパラメータを見やすい表で確認することもできます。

URLエンコード・デコードの使い方

  1. テキストをURLで安全に使える形にするならエンコード、パーセントエンコードされた文字列を読める文字に戻すならデコードを選びます。
  2. 上の欄に入力するか貼り付けます。1文字入力するたびに結果が更新されるので、ボタンを押す必要はありません。
  3. エンコードでは、値ひとつではなくアドレス全体を貼り付けた場合はURL全体をエンコードを、結果をフォーム形式のクエリ文字列に入れる場合はスペースを+に変換をオンにします。
  4. デコードでは+をスペースに変換が最初からオンになっています。テキスト中のプラス記号が本当の「+」である場合はオフにしてください。
  5. コピーを押すか、⇅ 入れ替えで結果を入力欄に移してモードを切り替えます。エンコードしてからデコードして元に戻るかを、すばやく確かめられます。

入力が http:// または https:// で始まる完全なアドレスの場合は、URLの構成要素の表が表示され、プロトコル、ホスト、デコード済みのパス、クエリパラメータ(1行に1つずつ)、# の後ろのフラグメントが並びます。長いトラッキングリンクや、送られてきたAPIリクエストを読むのにいちばん手早い方法です。

パーセントエンコーディングとは

URLの書式を定めた標準規格RFC 3986では、そのまま書けるASCII文字はごく一部に限られています。英字、数字、- . _ ~ は「非予約文字」で、エンコードの必要はありません。: / ? # [ ] @ ! $ & ' ( ) * + , ; = などは「予約文字」で、URLの各部分を区切る役目があるため、値の中に現れるときはエンコードしなければなりません。それ以外の文字、つまりスペース、引用符、アクセント付きの文字、日本語・韓国語・中国語、絵文字は常にエンコードされます。

エンコードは文字単位ではなくバイト単位で行われます。まずテキストをUTF-8に変換し、エスケープが必要なバイトごとに % と2桁の16進数を書きます。そのため1文字が複数のエスケープになることがあります。é は2バイト(%C3%A9)、ひらがな・カタカナ・漢字はほとんどが3バイト(カ は %E3%82%AB)、👍 のような絵文字は4バイト(%F0%9F%91%8D)です。

3つのオプション

  • 標準ではJavaScriptの encodeURIComponent を使います。英字、数字、- _ . ! ~ * ' ( ) 以外をすべてエスケープするので、&、=、/、?、+ もエンコードされます。検索語、パラメータの値、パスの中のファイル名など、URLの一部分に使います。
  • URL全体をエンコードは encodeURI に切り替えます。予約文字には手を付けないので、アドレスの構造が保たれます。スペースや日本語を含むリンクを整えるときに使います。
  • スペースを+に変換は、すべての %20 を + に置き換えます。HTMLフォーム送信(application/x-www-form-urlencoded)の慣習です。標準モードでは、もともとテキストにあったプラス記号は %2B になるため、スペースと混同されません。

変換例

入力設定出力
café & croissants標準caf%C3%A9%20%26%20croissants
café & croissantsスペースを+にcaf%C3%A9+%26+croissants
カフェ標準%E3%82%AB%E3%83%95%E3%82%A7
a+b=c標準a%2Bb%3Dc
50% off標準50%25%20off
https://example.com/search?q=naïve café&lang=frURL全体https://example.com/search?q=na%C3%AFve%20caf%C3%A9&lang=fr

URL全体のエンコードでは、値の中にすでに予約文字が入っているアドレスは直せません。https://example.com/search?q=rock & roll&page=2 をこの方法でエンコードすると q=rock%20&%20roll となり、サーバーは q を「rock 」としか読みません。値だけを標準モードでエンコードして rock%20%26%20roll にしてから、アドレスに組み込むのが正解です。

よくある失敗

  • 二重エンコード。エンコード済みのテキストをもう一度エンコードすると、すべての % が %25 になり、%20 は %2520 になります。リンクに %25 と2桁の16進数が続いていたら、どこかで2回エンコードされています。一度デコードして確かめてください。
  • 残すべき+記号。クエリ文字列の + はふつうスペースを意味しますが、パスや encodeURIComponent で作られたデータでは本物のプラスのこともあります。+81… のような電話番号がデコード後に+を失うなら、+のオプションをオフにしてください。
  • 古い文字コード。古いシステムの中には、UTF-8ではなくShift_JISやEUC-JP、Latin-1のバイトをエンコードして caf%E9 のような結果を出すものがあります。これは正しいUTF-8ではないため、デコーダーは推測せずにエラーを表示します。
  • HTMLエスケープが必要な場面でURLエンコードを使う。パーセントエンコードが安全にするのはURLの中だけで、Webページの中ではありません。HTMLで < や & を表示するにはHTMLエスケープを使ってください。バイナリデータをURLに入れるなら、URLセーフなBase64のほうが向いていることが多いです。

よくある質問

デコードするとエラーになるのはなぜですか?

2桁の16進数が続かない % がある(100% など)か、複数バイトの文字が途中で切れているためです。たとえば %E2%82 は、最後の %AC があって初めて € になります。文字列全体をコピーしたか確認してください。割引率のように単にパーセント記号を含むだけのテキストは、もともとエンコードされていないので、デコードする必要はありません。

スペースは %20 と + のどちらですか?

URLのクエリ部分では、フォームデータを読むサーバーはどちらもスペースとして扱います。パスでは %20 だけが正しく、/my+file.pdf は名前に+を含むファイルを指します。迷ったら %20 を使ってください。どのサーバーでも通じます。

リンク内の日本語もエンコードすべきですか?

ブラウザのアドレスバーには日本語のまま表示されますが、実際に送られるのはパーセントエンコードされたバイトです。そうしたURLをコード、HTTPヘッダー、メールのテンプレート、サイトマップに書くときは、どのシステムでも同じアドレスとして読まれるようにエンコードしておきましょう。

日本語ドメインはどう扱いますか?

ホスト名にはPunycodeという別の仕組みが使われ、DNS上では 日本語.jp が xn--wgv71a119e.jp のように変換されます。パーセントエンコードは、パス、クエリ文字列、フラグメントのためのものです。