A nested redirect target
Input
https%3A%2F%2Fex.com%2Fp%3Fq%3Da%20b%26r%3D1%23top
Result
https://ex.com/p?q=a b&r=1#top
The whole URL was one parameter value. Once decoded it is obvious which query the callback was carrying.
Decode escaped URLs and inspect the original path or query string.
https://softkey-tools.local/search?q=angular tools&mode=phase 1
Understand the format
Decoding turns percent-escapes back into the characters they represent, which is how you read what a redirect, callback, or tracking parameter actually contained.
Percent-decoding reverses the escaping: each %XX sequence becomes the byte with that hexadecimal value, and the resulting byte sequence is interpreted as UTF-8. A single non-ASCII character often appears as two or three consecutive escapes, so %C3%A9 is one character, é, rather than two.
Decoding is the fastest way to understand an opaque URL. Authentication callbacks, payment returns, and marketing links routinely nest a complete URL inside a parameter, and reading it plainly usually explains at once why the user was sent to the wrong place.
If the decoded output still contains percent escapes, the value was encoded more than once. That happens when each layer of a system encodes a parameter that was already encoded by the layer before it. Decoding repeatedly is fine for diagnosis, but the real fix is to remove the extra encoding step in the pipeline.
Note that the reverse case, a value that fails to decode, is also informative. A stray % that is not followed by two hexadecimal digits is a malformed URI, which is usually the result of concatenating strings by hand instead of encoding them properly.
Step by step
Decoding uses decodeURIComponent in the page. Callback URLs, internal hostnames, and query parameters are never transmitted or stored.
Worked examples
Input
https%3A%2F%2Fex.com%2Fp%3Fq%3Da%20b%26r%3D1%23top
Result
https://ex.com/p?q=a b&r=1#top
The whole URL was one parameter value. Once decoded it is obvious which query the callback was carrying.
Input
a%2520b
Result
a%20b, which decodes again to "a b"
The %25 is a literal percent sign, the fingerprint of a value that passed through two encoding steps.
Reference
| Symptom | Cause | Action |
|---|---|---|
| Output still contains %20 or %3A | The value was encoded twice. | Decode again, then remove the duplicate encoding step upstream. |
| URI malformed error | A stray % or an incomplete escape. | Check for hand-built strings and truncated copies. |
| Accented characters appear as é | The bytes were decoded as Latin-1 somewhere in the chain. | Ensure UTF-8 is used end to end. |
| Plus signs became spaces | The producer used form encoding. | Expected in form-encoded data; escape literal + as %2B. |
Practical Guide
Troubleshooting
FAQ
A % must be followed by exactly two hexadecimal digits. A lone percent sign, a truncated escape, or an invalid UTF-8 byte sequence causes the decoder to stop.
Look for %25 in the source, or percent escapes that survive one round of decoding. Both mean an encoding step ran twice.
Not here. Percent-decoding leaves + alone, because that convention belongs to form encoding rather than to URI syntax. Replace + with a space yourself when the source is a form-encoded body.
Yes. Decoding is pure text processing in your browser and does not request the URL. Reading a suspicious link this way is safer than clicking it.
A charset mismatch. The escapes decode to UTF-8 bytes here; if the producer used a different encoding, accented characters and symbols come out garbled.
Go deeper