Incomplete percent triplet
A trailing % or value such as %2 lacks a full byte. Keeping it silently can make one component disagree with another strict decoder.
One strict round · UTF-8 · No navigation
Decode percent-encoded component, full-URI, or form text once and report malformed escapes instead of repairing them. The value stays in this browser tab and is never opened as a link.
input caf%C3%A9%20%26%20tea
output café & tea
One layer decodedMalformed UTF-8 is an error
Reveal one encoding boundary
Paste up to 200,000 UTF-16 code units, select the matching component, URI, or form context, and decode exactly one layer. The page reports invalid percent escapes and never visits the output.
Loading the URL decoder…
Enable JavaScript to decode and copy text. The strictness and security guidance below remains readable.
Triplets become bytes, then UTF-8 text
A percent triplet contains % followed by exactly two hexadecimal digits. Decoding %2F produces byte 2F, which is the ASCII slash. Non-ASCII characters require several triplets because their UTF-8 representation contains several bytes. Korean 한, for example, is represented by three UTF-8 bytes and therefore three percent triplets.
Strict decoding has two useful failure boundaries. First, every percent sign must introduce two hexadecimal digits. Second, the recovered byte sequence must be valid UTF-8 for component text. A forgiving decoder can conceal a damaged log line or create different interpretations between a proxy, framework, and application. This tool makes malformed input visible instead.
One click removes only one layer. The encoded text %252F becomes %2F after one round because %25 represents a percent sign. It does not immediately become a slash. That intermediate state is important when diagnosing double-encoding and when evaluating validation that occurs before another layer decodes the value.
Decoding is not decryption, malware scanning, redirect analysis, or URL validation. The output can contain delimiters, credentials, control characters, or misleading Unicode. Treat decoded text as untrusted data and inspect it before copying it into a browser, command, template, database query, or security decision.
Decode with the producer's rules
strict percent + UTF-8A path segment, query value, fragment value, or output produced with component encoding.preserves reserved escapesA complete URI encoded with full-URI rules, where decoding reserved delimiters could change its structure.+ → space, %2B → +application/x-www-form-urlencoded query or form data serialized by a browser API such as URLSearchParams.See why %20 and + are not interchangeable in every URL context →
Preserve evidence before changing it
Copy the exact string to a private scratch location before decoding. Do not trim spaces, normalize percent hex case, or replace plus signs until you know the source format.
Use form mode only for form-style data. For an individual percent-encoded value, start with strict component mode. Use full URI mode when reserved escapes must remain encoded.
If percent triplets remain, determine which application layer created them before decoding again. Never make recursive decoding the default for untrusted input.
Failures carry useful information
A trailing % or value such as %2 lacks a full byte. Keeping it silently can make one component disagree with another strict decoder.
%GG is not a percent-encoded byte. Report it at the source boundary rather than inventing a replacement value.
%FF cannot stand alone as valid UTF-8 text. A replacement character would hide which original bytes were present.
A result such as %2E%2E%2F may be intentional data or another encoded path traversal sequence. Pause before decoding it again.
Readable does not mean safe
Security bugs arise when two layers decode at different times. A front proxy may validate an encoded path while an application server decodes it again, or a router may decode a component before a framework applies another normalization. A value rejected in its final form can sometimes pass an earlier check while still encoded. The defense is a documented canonicalization boundary, not indiscriminate recursive decoding.
Query strings and callback URLs often contain OAuth authorization codes, signed parameters, session identifiers, email addresses, and private filters. Processing here stays in the tab and does not call a decoding service, but copied output can still leak through a clipboard manager, screenshot, ticket, prompt, or extension. Redact secrets before sharing.
The decoder never makes a network request. It cannot tell whether a hostname exists, a redirect is malicious, a link is a phishing page, or a decoded command is safe. Use an appropriate isolated security workflow when the input comes from an untrusted message or incident.
After decoding only the intended layer, use the URL parser to inspect scheme, host, path, query, and fragment without fetching the destination.
Open the URL parser →Questions answered
A URL decoder interprets valid percent triplets as bytes and decodes the resulting UTF-8 sequence to text under the selected URL context. Form mode also interprets a literal plus sign as a space before percent-decoding.
Strict decoding reports an error for a stray percent sign, a percent sign without two hexadecimal digits, or percent-encoded bytes that are not valid UTF-8. It does not silently keep, replace, or guess malformed data.
No. One operation decodes exactly one layer. For example, %2520 becomes %20, not a space. Inspect that intermediate value before deliberately running another decode, because recursive decoding can change structure or bypass validation assumptions.
A literal plus sign becomes a space only in application/x-www-form-urlencoded form mode. In ordinary URL component and full URI decoding, plus remains plus. A form-encoded literal plus should arrive as %2B.
Each %XX triplet represents one byte, not necessarily one complete character. The selected bytes must form valid UTF-8 when decoded as component text. Values such as %FF or an incomplete multibyte sequence have no valid UTF-8 text result and are rejected.
No. Decoding runs in the current browser tab. The tool does not upload the input, perform DNS lookup, navigate to the output, follow redirects, fetch remote content, or decide whether the decoded address is safe.
The decoder accepts at most 200,000 UTF-16 code units in one operation. The limit bounds browser conversion and rendering work; it is not a claim about URL length limits in a browser, server, proxy, or application.