URLs only allow a limited set of characters. Everything else — spaces, accents, &, =, ?, # — must be percent-encoded: the character's UTF-8 bytes are written as %XX hexadecimal pairs. A space becomes %20, é becomes %C3%A9.
The subtlety is context: characters like & and = are legal in a URL but have meaning as query-string separators. Encoding a whole URL versus a single parameter value are different operations — this tool applies component rules (like JavaScript's encodeURIComponent), which is what you want for individual values.
A classic pitfall is double encoding: encoding an already-encoded value turns %20 into %2520. If a decoded value still contains %-sequences, it was probably encoded twice at some point in the pipeline.