パラメーター値など、URLの構成要素として扱うテキストをエンコード・デコードします。ブラウザー標準のencodeURIComponentとdecodeURIComponentを使い、入力全体を1つのデータとして変換します。完全なURLの構造を保つ処理ではありません。
ブラウザ内でローカルに実行テキストを直接貼り付けて使います。変換はブラウザー内で行い、入力したアドレスにはアクセスしません。ファイルの読み込みや一括処理には対応していません。
エンコードではA-Z a-z 0-9と - _ . ! ~ * ' ( ) を変更しません。それ以外の有効なUnicode文字はUTF-8バイトのパーセント表記になります。たとえば、你好 😀 は %E4%BD%A0%E5%A5%BD%20%F0%9F%98%80 になります。RFC 3986への厳密な適合を目的とした ! ' ( ) * の追加エスケープは行いません。
a=1&b=two words をエンコードすると a%3D1%26b%3Dtwo%20words になります。完全なURLを貼り付けた場合も : / ? & = は変換されます。アドレス全体を値として扱う用途には使えますが、URLの構造は保持しません。
デコードした区切り文字をURLに戻すと、解釈が変わることがあります。必要に応じてパラメーターのデータとして扱ってください。URLの妥当性検証や暗号化は行いません。結果はプレーンテキストで表示し、HTMLとして実行しません。
%20 をエンコードすると %2520 になります。逆に %2520 を1回デコードすると、空白ではなく文字列 %20 が得られます。処理は1段階だけで、繰り返しデコードしたり、入力を結果に自動置換したりしません。
application/x-www-form-urlencodedの処理ではないためです。エンコードでは空白が%20、+が%2Bになります。デコードでは文字そのものの+を残すので、a+b%20c は a+b c になります。
%、%GG、%E4%A のような不正なエスケープや、%FF、%C0%AF のような無効なUTF-8はデコードできず、置換文字ではなくエラーになります。対になっていないUTF-16サロゲートのエンコードも失敗します。デコード時はエスケープ以外の文字列をそのまま残し、個々の文字の妥当性までは検証しません。
先頭・末尾を含め、空白文字を削除する処理はありません。ただし、ブラウザーのtextareaは入力された改行をLFにそろえ、エンコード結果は%0Aになります。元のCRLFやCRのバイト列は保持されません。Unicode正規化は追加せず、空の入力は空の結果になります。