URL encoder and decoder

Percent-encode and decode text, with the component-vs-full-URI distinction made explicit — the difference that decides whether your slashes and ampersands survive.

Component or full URI — pick the wrong one and it breaks

This is the entire subject. Component encoding escapes / ? & = # : along with everything else, because those characters are structural: a slash inside a query value is data, and leaving it literal is how a value ends up parsed as a path.

Full-URI encoding leaves those characters alone, because in a whole URL they are doing their structural job. Use it to make an already-assembled URL safe to transmit.

The rule of thumb: encoding one piece you are about to put into a URL is component encoding. Encoding a URL you already have is full-URI encoding.

Double encoding

Encoding an already-encoded string turns %20 into %2520, and the reader gets a literal "%20" in their data. If a decode here produces something that still contains percent escapes, you are looking at a double-encoded value — decode it twice.

Characters that are never escaped

A–Z a–z 0–9 - . _ ~ are the unreserved set and stay literal in every mode. An encoder that escapes them is producing valid but noisy output; normalization will decode them again.

Occasional email

New tools, when there are new tools

No more than once a month, no tracking pixels in the mail, one-click unsubscribe.