Find your next tool

Browse tools or search by task

Explore JSONToonPro

Encoding & Decoding Tools

URL Decode Online – Percent-Encoding Decoder

Decode percent-encoded URLs and query strings online. Convert %20, %2F and Unicode escape sequences back to readable text instantly.

Runs locally in your browser. Nothing you paste is uploaded.

URL Decode workspace
Encoded string
0 chars
Decoded text
Result appears here...

How URL Decoding Works

Paste percent-encoded text and choose the appropriate decoding mode. Decoding interprets encoded byte sequences as characters. It does not fetch or visit the URL, and a decoded string should still be treated as untrusted input.

Percent-Encoding Examples

%20 represents a space, %2F a slash and %26 an ampersand. Case in the hexadecimal digits is not significant. A literal percent sign is %25; repeated decoding can change meaning, so decode only the expected layer.

Decoding Query Strings and Unicode

UTF-8 sequences represent non-ASCII text. Form-encoded query strings may use plus for spaces, which is a different convention from ordinary URI decoding. Use URLSearchParams when parsing a complete query string in application code.

Malformed URL Encoding Errors

A percent sign needs two hexadecimal digits, and multi-byte sequences must be valid. Truncated input or mixed encodings can fail. Locate the malformed sequence before retrying rather than guessing missing bytes.

URL Decode vs Base64 Decode

URL decoding reverses percent escapes used in URI contexts. Base64 decoding reconstructs bytes from a different alphabet. Choose the decoder indicated by the protocol or source field, not just by how encoded the text looks.

More examples and technical details

How URL Decoding Works

Decoding is a simple scan. The decoder walks the string one character at a time and copies everything straight through until it meets a percent sign. At that point it reads the next two characters, interprets them as a hexadecimal byte value, and writes that byte to the output. When the scan is finished, the collected bytes are interpreted as UTF-8 text.

That last step matters for non-ASCII content. Characters outside ASCII were encoded as several bytes, so %E2%82%AC is not three separate characters but one euro sign assembled from three consecutive escape sequences. A decoder that handles each escape in isolation produces mojibake.

Worked Example

Input:
name%3DJohn%20Doe%26city%3DS%C3%A3o%20Paulo
 
Scan:
%3D -> 0x3D -> =
%20 -> 0x20 -> space
%26 -> 0x26 -> &
%C3%A3 -> bytes C3 A3 -> one UTF-8 character: a with tilde
 
Output:
name=John Doe&city=Sao Paulo (with the tilde restored)

Why Decoding Fails

  • Malformed sequences. %ZZ or %G1 are not hexadecimal, so the decoder throws. In JavaScript this surfaces as a URIError from decodeURIComponent.
  • Truncated escape. A percent sign at the very end of the string, or followed by only one character, has nothing to read.
  • Literal percent signs. Text like "50% off" that was never encoded will break a decoder, because %20 is read as an escape sequence. A literal percent must always be written as %25.
  • Invalid UTF-8. Byte sequences that do not form valid UTF-8, often because the value was encoded in Latin-1, decode to replacement characters.

The Plus Sign Problem

Form submissions encode a space as a plus sign, but decodeURIComponent implements RFC 3986 and knows nothing about that convention. Feed it form data and every space comes back as a literal plus.

decodeURIComponent("hello+world") -> "hello+world" wrong
decodeURIComponent("hello%20world") -> "hello world" right
 
For form-encoded input, replace + with a space first:
decodeURIComponent(input.replace(/\+/g, " "))
 
Or let the platform do it:
new URLSearchParams("q=hello+world").get("q") -> "hello world"

Beware of doing the replacement blindly. If the value legitimately contains a plus sign, for example a phone number or an email address with a plus tag, and it was correctly encoded as %2B, that escape survives the naive replace and decodes back to a plus. But a raw plus that was never meant as a space will be destroyed.

Double Encoding and How to Spot It

Double encoding happens when a value passes through two encoding steps, typically because one layer of a system encodes defensively and another does it again. The signature is a percent sign followed by 25, since the percent sign of the first escape gets encoded on the second pass.

Original: hello world
Encoded once: hello%20world
Encoded twice: hello%2520world %25 is the encoded %
 
Decoding once: hello%20world still looks encoded
Decoding twice: hello world
 
Red flags in a URL: %2520 %253A %2526 %25252F

The correct fix is to remove the duplicate encoding step, not to decode twice in the consumer. Blind repeated decoding is a known security hazard: filters that inspect a URL once but a downstream component decodes twice have been the root cause of path traversal and access control bypasses.

Percent-Encoding Reference Table

These are the characters you meet most often when working with query strings, path segments, and form data. Each one is replaced by a percent sign followed by the two hexadecimal digits of its byte value.

CharacterEncodedName
space%20Space
!%21Exclamation mark
"%22Double quote
#%23Hash / fragment delimiter
$%24Dollar sign
%%25Percent sign
&%26Ampersand / parameter separator
'%27Apostrophe
(%28Left parenthesis
)%29Right parenthesis
*%2AAsterisk
+%2BPlus sign
,%2CComma
/%2FSlash / path separator
:%3AColon / scheme separator
;%3BSemicolon
=%3DEquals / key value separator
?%3FQuestion mark / query start
@%40At sign
[%5BLeft square bracket
]%5DRight square bracket
newline%0ALine feed
tab%09Horizontal tab

Working on something related? Browse every free developer tool on the site, including a URL encoder, Base64 decoder, HTML decoder, and JSON formatter. Everything runs entirely in your browser, so nothing you paste is ever uploaded.

Standards and references

Frequently asked questions

How do I decode a percent-encoded URL?

Paste the encoded text in Decode mode; choose the mode that matches how it was encoded.

What does %20 mean?

It is the percent-encoded representation of a space.

Can I decode Unicode URL sequences?

Yes, when the percent escapes encode valid UTF-8.

Why does malformed percent encoding fail?

Incomplete escapes or invalid UTF-8 cannot be interpreted reliably and cause a decoding error.

Is the URL uploaded?

No. Input is processed in this browser tab and is not uploaded by the tool. Copy and download are actions you control; ordinary page analytics do not receive tool input.