URLエンコード/デコード

URLエンコードは、URLに使えない文字を % と16進数2桁に置き換えます。「日本」は %E6%97%A5%E6%9C%AC、スペースは %20 になり、デコードすると 日本 に戻ります。

問題は解決しましたか?
Googleで優先表示

使い方

  1. エンコードかデコードを選び、入力欄に文字を入力または貼り付けます。
  2. 検索語のような値ひとつを変換するならコンポーネント、アドレス全体を変換して : / ? & = # などをそのまま残すならURL全体を選びます。
  3. HTMLフォームのように + をスペースとして使うテキストなら、+ のオプションにチェックを入れます。結果は入力しながら更新されます。
  4. 入力がURLやクエリ文字列なら、結果の下の表にパラメーターごとのキーと値がデコードされて並びます。コピーで結果をコピー、入力に戻すで結果を逆方向にもう一度変換できます。

計算方法

パーセントエンコードは、使えない文字をUTF-8のバイト列にし、1バイトずつ % と16進数2桁で書きます。「あ」はE3 81 82の3バイトなので %E3%81%82 になります。日本語1文字はたいてい3バイト、絵文字は4バイトです。

コンポーネントは encodeURIComponent を使います。英数字と - _ . ! ~ * ' ( ) 以外はすべてエスケープし、/ ? & = : # も変換します。URLの中の値ひとつに使います。URL全体は encodeURI を使い、URLの構造を作る ; , / ? : @ & = + $ # を残すので、アドレス全体向けです。

デコードはその逆です。% の後ろに16進数2桁がない、またはバイト列がUTF-8として正しくない場合、ブラウザがデコードを拒否し、エラーを表示します。クエリの表ではその部分を元のまま赤で示すので、1つの壊れた値のせいで他が見えなくなることはありません。

+ がスペースを意味するのはフォームデータ(application/x-www-form-urlencoded)とほとんどのクエリ文字列だけで、パスの中では + はそのままプラス記号です。クエリの表は常に + をスペースとして読み、メインのデコードはオプションにチェックしたときだけそうします。

よく使う文字の変換表

文字エンコード後メモ
スペース%20(または +)+ はクエリ文字列でのみ
&%26パラメーターの区切りなので値の中ではエンコード
=%3Dキーと値の区切り
?%3Fクエリ文字列の始まり
#%23フラグメントの始まり
/%2Fパスの区切り
%%25エスケープ文字そのもの
+%2Bプラス記号そのものはエンコードが必要

よくある質問

encodeURI と encodeURIComponent の違いは?

encodeURIComponent はURLの区切り文字(/ ? & = : #)もエスケープするので、値ひとつに使っても安全です。encodeURI は区切り文字を残すので、構造を壊さずにアドレス全体をエンコードできます。

スペースが %20 になったり + になったりするのはなぜ?

%20 がスペースの標準的なエンコードで、どこでも使えます。+ はフォーム由来の古い書き方で、クエリ文字列の中でだけ有効です。+ のオプションにチェックすると、エンコード時に %20 の代わりに + を書きます。

デコードで不正な形式のエラーが出るのは?

単独の %、% の後ろが16進数でない文字、%E3 だけのようにUTF-8として不完全なバイトが含まれています。壊れた部分を直すか消してください。クエリの表には残りのパラメーターが表示されます。

日本語や絵文字も変換できますか?

できます。先にUTF-8に変換するので、日本語でも絵文字でもエンコードしてデコードすれば元どおりに戻ります。文字化けしたURLを読める形に戻すときにも使えます。

入力したURLはサーバーに送られますか?

いいえ。すべてブラウザの中で処理します。トークンや個人情報を含むリンクも端末の外に出ません。