ASCII URL Decoder
Decode percent-encoded ASCII URL strings instantly. Convert %20, %3D, %26 and other URL-encoded characters back to readable text online.
About
Percent-encoding (RFC 3986) replaces unsafe ASCII characters with a % sign followed by two hexadecimal digits representing the character's byte value. A space becomes %20, an ampersand becomes %26, and an equals sign becomes %3D. Failing to decode these sequences before parsing query parameters, logging URLs, or debugging API calls leads to misread data, broken routing logic, and silent integration failures. This tool applies decodeURIComponent with a fallback byte-level parser that handles malformed sequences standard browsers would reject.
Double-encoding is a common trap: a literal %20 in source text gets encoded as %2520, and a single decode pass returns %20 instead of the intended space. This decoder detects residual percent sequences in the output and warns you. It processes all 128 ASCII code points (U+0000 to U+007F) and correctly passes through non-encoded characters unchanged. Limitations: this tool targets ASCII-range percent-encoding. Multi-byte UTF-8 sequences (e.g., %C3%A9 for Γ©) are decoded where valid but may produce replacement characters if the byte sequence is incomplete.
Formulas
Percent-encoding maps each byte of a character to a triplet consisting of the percent sign and two uppercase hexadecimal digits. The decoding operation reverses this:
Where H1 and H2 are hexadecimal digits in range 0 - 9, A - F. hexval converts a hex digit to its integer value (0 - 15). char maps the resulting integer to its Unicode code point. For ASCII, valid code points fall in the range 0 - 127 (U+0000 to U+007F).
The + sign in application/x-www-form-urlencoded contexts represents a space (ASCII 32). This tool optionally decodes + as space when the form-encoding mode is active. Double-encoding detection checks if the decoded output still contains %HH patterns via the regex /%[0-9A-Fa-f]{2}/.
Reference Data
| Character | ASCII Code | Encoded Form | Category |
|---|---|---|---|
| (space) | 32 | %20 | Whitespace |
| ! | 33 | %21 | Reserved (sub-delim) |
| # | 35 | %23 | Fragment delimiter |
| $ | 36 | %24 | Reserved (sub-delim) |
| % | 37 | %25 | Encoding prefix |
| & | 38 | %26 | Query separator |
| + | 43 | %2B | Reserved (sub-delim) |
| , | 44 | %2C | Reserved (sub-delim) |
| / | 47 | %2F | Path delimiter |
| : | 58 | %3A | Scheme/port delimiter |
| ; | 59 | %3B | Parameter delimiter |
| = | 61 | %3D | Key-value separator |
| ? | 63 | %3F | Query delimiter |
| @ | 64 | %40 | Userinfo delimiter |
| [ | 91 | %5B | IPv6 bracket |
| ] | 93 | %5D | IPv6 bracket |
| { | 123 | %7B | Unsafe |
| | | 124 | %7C | Unsafe |
| } | 125 | %7D | Unsafe |
| ~ | 126 | %7E | Unreserved |
| \t (tab) | 9 | %09 | Control character |
| \n (newline) | 10 | %0A | Control character |
| \r (return) | 13 | %0D | Control character |
| " | 34 | %22 | Unsafe |
| < | 60 | %3C | Unsafe (HTML) |
| > | 62 | %3E | Unsafe (HTML) |
| \ | 92 | %5C | Unsafe |
| ^ | 94 | %5E | Unsafe |
| ` | 96 | %60 | Unsafe |