Decode URL-encoded strings back to plain text. All client-side.
Paste a percent-encoded URL or string in the input box and click URL Decode to convert it back to readable text. Click URL Encode to reverse it. This tool uses JavaScript's decodeURIComponent(), which decodes all %XX sequences including Unicode multi-byte sequences.
URL decoding (percent decoding) reverses percent encoding: it converts each %HH sequence back to its corresponding UTF-8 character. For example, %20 becomes a space, %2F becomes /, and %C3%A9 becomes é.
URL decoding is commonly used to read query string parameters from server logs, debug API requests, and interpret redirects that contain encoded data.
%20 → space %21 → ! %22 → " %23 → #
%24 → $ %25 → % %26 → & %27 → '
%28 → ( %29 → ) %2A → * %2B → +
%2C → , %2F → / %3A → : %3B → ;
%3D → = %3F → ? %40 → @ %7B → {
%7D → } %7C → |
Unicode: %C3%A9 → é (U+00E9, UTF-8 bytes: 0xC3 0xA9)
// Decode a query parameter value
const decoded = decodeURIComponent('hello%20world%20%26%20more');
// "hello world & more"
// Extract and decode query params automatically
const params = new URLSearchParams(location.search);
const q = params.get('q'); // automatically decoded
// Safe decode (won't throw on malformed input)
function safeDecode(s) {
try { return decodeURIComponent(s); } catch { return s; }
}
from urllib.parse import unquote, unquote_plus, parse_qs
# Decode %XX sequences
decoded = unquote('hello%20world') # 'hello world'
decoded = unquote_plus('hello+world') # 'hello world' (+ → space too)
# Parse and decode a full query string
params = parse_qs('q=hello%20world&lang=en')
# {'q': ['hello world'], 'lang': ['en']}
decodeURIComponent converts %20 to a space but leaves + as a literal +. If the input uses + for spaces (HTML form encoding), replace + with %20 first, or use decodeURIComponent(str.replace(/\+/g, ' ')).%25 is a percent-encoded % sign. After decoding, you get a literal %. If you see %2520, the string was double-encoded: %20 (a space) was encoded again, turning the % into %25.decodeURIComponent throws a URIError if a %XX sequence doesn't form valid UTF-8. This happens with legacy Latin-1 encoded URLs or truncated sequences. In Python, use unquote(string, encoding='latin-1') for legacy data.decodeURI() decodes a complete URL but leaves structural characters (/ ? # & : etc.) encoded. decodeURIComponent() decodes everything including structural characters — use it for individual query parameter values.