パーセント符号化がしていること
URLに使える文字は限られています。それ以外はUTF-8のバイトに変換し、1バイトずつパーセント記号と16進数2桁で書きます。空白は%20、éは%C3%A9、日本語の1文字は3バイトなので%E6%97%A5のように9文字になります。
この道具は、アドレス全体を符号化する場合と、値ひとつを符号化する場合を区別します。アドレス全体ではスラッシュや疑問符のような構造の文字が残らなければなりませんが、値ひとつ、たとえば検索語では、同じ文字も符号化しなければ引数が途中で切れてしまいます。
復号は逆向きに動き、パーセントの三文字組をバイトに戻して UTF-8 として読みます。ログや参照元に記録されたアドレスから、元の検索語を取り出す用途が最も多いでしょう。
符号化する範囲を取り違える
値ひとつをアドレス全体のつもりで符号化すると、引数が途中で切れます。検索語にアンパサンドが含まれていてそのまま残ると、サーバーはそこから新しい引数が始まったと読みます。クエリの値には部品単位の符号化が要ります。
逆もまた失敗します。アドレス全体を部品単位で符号化するとスラッシュとコロンまで書き換えられ、リンクが開かなくなります。部品単位が正しいのは、出来上がった URL を別の URL の引数として運ぶときで、結果をそのままアドレス欄に入れる場合には誤りです。
すでに符号化された文字列をもう一度符号化すると、パーセント記号がそれぞれ %25 になり二重になります。出力に %25 がいくつも見えるなら、ほぼ必ずこれが起きています。元に戻すには復号を二回くり返す必要があります。