URL Decoder

Decode percent-encoded URLs and URI components back to plain text.

Encoded Input
0 charsencodeURIComponent
Decoded Output
%
output will appear here

Where you will encounter percent-encoded URLs

Percent-encoded strings appear throughout web development. These are the five contexts where developers most often need to decode them:

Browser address barhttps://example.com/search?q=hello%20world&lang=en

Browsers display the encoded form in the address bar. Copying a URL from the address bar and decoding it reveals the actual query values — useful for debugging search parameters or share links.

Server and access logs2026-04-20 GET /path?user=John%20Doe&ref=%2Fhome HTTP/1.1

Web server logs record the raw percent-encoded request URI. Decoding log entries makes them readable for debugging, filtering, and analysis — especially for query strings containing names, search terms, or redirect paths.

OAuth and redirect URIsredirect_uri=https%3A%2F%2Fapp.example.com%2Fcallback

OAuth flows encode the redirect_uri parameter so it can be embedded safely in a URL. Decoding it reveals the actual callback URL — the encoded form is required for the parameter to survive transport as a query string value.

API error messagesInvalid request: param%3D%22value%22%20contains%20special%20chars

Some APIs return percent-encoded strings in error responses, especially when they echo back your input. Decoding these reveals the exact string the server received, which is critical for debugging encoding issues.

curl and HTTP debuggingcurl "https://api.example.com/v1/search?q=caf%C3%A9&limit=10"

curl and similar tools log the literal encoded URL. Decoding reveals the actual query values — especially useful for non-ASCII content like accented characters, where %C3%A9 decodes to é.

How to read a percent-encoded sequence

Each %XX sequence is one byte expressed in hexadecimal, defined in RFC 3986. ASCII characters map one-to-one; non-ASCII characters use multiple sequences for the UTF-8 byte sequence:

EncodedHex byte(s)Decoded characterNotes
%200x20space ( )RFC 3986 encoding for space
%2F0x2F/Forward slash — structural in URLs
%3D0x3D=Equals — separates key=value
%260x26&Ampersand — separates &key=value pairs
%250x25%The percent sign itself
%C3%A90xC3 0xA9é (U+00E9)2-byte UTF-8 sequence
%E6%97%A50xE6 0x97 0xA5日 (U+65E5)3-byte UTF-8 sequence

Common decode errors and how to fix them

These four issues cover the vast majority of decoding failures. Each shows what goes wrong and the correct approach.

Using component mode on + spaces from a formmost common
✗ problem
// Form submitted: name=John+Doe&city=New+York
// Decoded with component mode:
decodeURIComponent("John+Doe")
→ "John+Doe"  // + is still a plus sign — wrong
✓ fix
// Use query string mode to handle + as space:
"John+Doe".replace(/\+/g, ' ')
→ then decodeURIComponent(...)
→ "John Doe"  // correct

In query string mode (application/x-www-form-urlencoded), + means space. Component mode does not handle this — it treats + as a literal character. Switch to query string mode in the toolbar when decoding HTML form data or older API responses.

Decoding a doubly-encoded string once
✗ problem
// String was encoded twice — once gives:
decodeURIComponent("hello%2520world")
→ "hello%20world"  // still encoded — needs decoding again
✓ fix
// Decode twice to fully recover the original:
decodeURIComponent(decodeURIComponent("hello%2520world"))
→ "hello world"  // correct

If your decoded output still contains %XX sequences, the input was double-encoded. The status bar shows "encoded sequences remaining" — run the swap button to decode the output again, or decode manually twice.

Malformed percent sequence
✗ problem
// Truncated or hand-edited URL
/search?q=caf%C3  // missing the second byte of é
→ URIError: URI malformed
✓ fix
// Complete the percent sequence or re-encode
/search?q=caf%C3%A9  // é is two bytes in UTF-8: %C3 %A9

Every percent sign in a URI must be followed by exactly two hexadecimal digits. A bare % or a truncated sequence like %C3 without its paired byte is a malformed URI. Multi-byte UTF-8 characters produce two or three percent-encoded sequences that must all be present.

Decoding a full URL with component mode
✗ problem
// Encoded URL decoded with encodeURIComponent mode
decodeURIComponent("https%3A%2F%2Fexample.com%2Fsearch%3Fq%3Dhello")
→ "https://example.com/search?q=hello"  // works here...
✓ fix
// But structural characters in the path decode correctly
// Use full URL mode to avoid accidentally decoding
// structural characters that should remain encoded

If a URL was encoded with encodeURI (full URL mode), decode it with full URL mode. If it was encoded with encodeURIComponent, use component mode. Mixing modes can decode structural characters that were intentionally kept encoded, changing the meaning of the URL.

Related tools

  • URL EncoderEncode components again after editing decoded values for safe use in links and forms.
  • Base64 DecoderDecode Base64 in query params or JWT segments when URLs carry encoded blobs.

Frequently asked questions

What does URL decoding do?

URL decoding (percent-decoding) reverses percent-encoding. Each %XX sequence is replaced with the character whose UTF-8 byte value matches the two hexadecimal digits. For example, %20 becomes a space, %C3%A9 becomes é, and %2F becomes /.

What is the difference between %20 and + for spaces?

%20 is the RFC 3986 percent-encoding for a space character and is valid everywhere in a URL. The + sign represents a space only in application/x-www-form-urlencoded data (HTML form submissions and query strings). In URL paths, + is a literal plus sign. Use query string mode when decoding form data; use component or full URL mode everywhere else.

How do I read a percent-encoded sequence manually?

Each %XX sequence represents one byte in hexadecimal. For ASCII characters, one sequence maps to one character: %41 = A (hex 41 = decimal 65). For non-ASCII characters, multiple sequences together encode one character: %C3%A9 are the two UTF-8 bytes for é (U+00E9). Paste the sequence here and component mode decodes it instantly.

Why does my decoded output still contain % characters?

Two possible causes: (1) the string was double-encoded — your decoded output is itself a percent-encoded string that needs decoding again; (2) the % is a literal percent sign that was correctly encoded as %25. If the output contains %25, decode again to get the actual % character.

What is the params table view?

The params table view (available in encode mode) parses a query string or full URL and displays each parameter as a row with its key, raw value, and encoded value side by side. This makes it easy to inspect which characters in each value are being encoded and why.

Can I decode a URL with non-ASCII characters?

Yes. Percent-encoded non-ASCII characters use UTF-8 byte sequences. %C3%A9 decodes to é, %E6%97%A5%E6%9C%AC%E8%AA%9E decodes to 日本語, and so on. The decoder reads the byte sequence and reconstructs the original Unicode character.

Is my data safe to paste here?

Yes. Decoding runs entirely in your browser using the native decodeURIComponent() JavaScript API. No data is transmitted to any server. You can verify this by opening DevTools → Network — there are no outbound requests while using the tool.