URLエンコード:リンクを壊さず値の意味を保つ
動いていたリンクに&、+、空白を含む名前を加えると問題が起きる場合があります。名前が無効とは限らず、同じ文字がURLの構造上の役割も持つためです。
値とURL全体は別
パラメーター値をエンコードし、&が別パラメーター、#がフラグメントの開始にならないようにします。一方、アドレス全体では構造の区切りを保持する必要があります。
アドレス全体、構成要素、フォーム値のどれかに合わせて処理を選びます。ある文脈で正しい結果が別の文脈にも合うとは限りません。
参考資料: WHATWG URL Standard — Percent encoding and form encoding
+の意味は文脈による
フォーム形式では+が空白、%2Bが実際のプラス記号です。構成要素では空白は通常%20になり、+を自動で空白とは解釈しません。
元の形式を知らずにすべての+を置き換えないでください。利用者の元の値と、運ぶための表現を分けて考えます。
参考資料: WHATWG URL Standard — Percent encoding and form encoding
デコードは決まった処理で、修復の繰り返しではない
2回デコードすると意味が変わる場合があります。見慣れた文になるまで繰り返さず、生成元が何層のエンコードを意図したか確認します。
このツールは表現を変えるだけで、行き先を訪問・検証しません。読めるURLは信頼性の証明ではなく、機密情報をエンコードしても隠せません。
例:プラス・空白・&を含む値
A+B & Cは構成要素としてA%2BB%20%26%20Cになります。フォーム形式ではA%2BB+%26+Cです。それぞれ対応する方式でデコードすれば元の値へ戻ります。
%252Fは1回で%2F、2回で/になります。パスや値の意味が変わるため、繰り返しデコードを無条件に安全な整理と考えないでください。