URL のエンコードとデコード

URL、クエリの値、フォーム本文をパーセントエンコードし、または元に戻します。初期値の UTF-8 は encodeURIComponent と同じです。相手が Shift_JIS など別の文字コードなら、そこで切り替えてください。

三つの符号化は別物です

パスのスラッシュは残し、クエリ値の中のスラッシュは %2F にします。フォームの空白は +、通常のクエリの空白は %20 です。全部を同じ関数にかけると、リンクが別のページを開きます。

  • クエリの値は encodeURIComponent。検索語や ID、戻り先に使います。
  • URL 全体は encodeURI。: / ? # は残します。すでに完全なアドレスがあるときです。
  • フォーム本文は空白が +。POST の本体であって、リンクではありません。

壊れやすい文字

値の中の本当のプラスは %2B にしないと、サーバは空白として読みます。& と = も値の中では符号化しないと、次のパラメータが始まります。初期値は UTF-8 で、encodeURIComponent と同じです。漢字は各バイトが % と十六進二桁になります。「北京」は一つのエスケープではありません。相手が Shift_JIS なら文字コードを切り替えると、同じ文章でも別のパーセント列になります。Hex は欄の十六進バイトをパーセント符号化します。

完成した https:// を「クエリの値」で符号化すると、コロンとスラッシュまで置き換わり、ブラウザはアドレスとして扱いません。部品ごとに符号化してから繋ぎます。バイト列は 文字列からバイト、別方式は Base64 です。

質問

空白が + になった

フォーム本文を選んでいます。リンクなら「クエリの値」に戻してください。

戻しても %20 が残る

二回符号化されています。読めるところまで、もう一度デコードします。