Skip to the tool
corpberry.com

Link Tools

Percent-encoding reference

The same character does not mean the same thing in a path, a query and a fragment. That is the source of most URL bugs, and it is why this tool decodes each position with different rules.

The one that catches everyone: +

PositionInputDecodes to
Querya+ba b
Patha+ba+b

In a query string + means a space, because queries inherit application/x-www-form-urlencoded from HTML forms. In a path it is an ordinary character. So /a+b/ is a directory literally called a+b, and rendering it as /a b/ is wrong.

This matters beyond cosmetics: + is a real character in the standard base64 alphabet, and a parser that form-decodes a base64 value destroys it. So when a value could be either, Inspect shows both readings instead of choosing.

Reserved characters (RFC 3986 §2.2)

These delimit parts of a URL. Encode them when they are data rather than structure.

CharEncoded Structural meaning
:%3AEnds the scheme; separates host from port
/%2FPath separator. Inside a segment, %2F is a literal slash, not a separator
?%3FStarts the query
#%23Starts the fragment. Never sent to the server
[ ]%5B %5DWrap an IPv6 literal host
@%40Ends userinfo. Everything before it is a username, not the host
&%26Separates query pairs
=%3DSeparates a key from its value
;%3BA legacy pair separator. Most modern servers no longer accept it

Unreserved characters

A–Z a–z 0–9 - . _ ~ never need encoding, anywhere. Encoding them is legal but produces a different-looking URL that means the same thing, which is why normalising percent-encoding case and decoding unreserved octets are safe operations and dropping a query parameter is not.

Double encoding

%2520 is %20 encoded again, which is a space encoded twice. It usually means a URL passed through one system that encoded it and then another that encoded it again. Inspect peels these one layer at a time and shows each one.

The opposite mistake is just as common: decoding a wrapper parameter twice. A link wrapped by a mail gateway holds its target encoded once, and a second pass eats the target's own %20 sequences, producing a different URL.

Malformed escapes

%zz is not valid, and neither is a trailing %2. Many decoders return an empty string for these, silently turning ?bad=%zz into ?bad=, which looks like a real, empty value. This tool keeps the raw text and says the escape is broken.

Inspect a URLEncode or decode a value