URL Encoder & Decoder
Encode or decode UTF-8 text as a URL component or form value. Runs in your browser.
Enable JavaScript to encode or decode URL text locally in your browser.
Component spaces: %20. Form spaces: +. Literal + encodes as %2B. Decoding raw +: component keeps it; form makes a space.
Up to 200,000 UTF-16 code units. Text clears when you leave or refresh.
A single text value. No URL is opened or fetched.
Convert one text value in three steps
- Choose Direction and Mode, then paste your text. Try example fills an empty input without converting it.
- Select Encode text or Decode text to convert once. Nothing converts automatically.
- Review the output and select Copy result. If clipboard access fails, select the result and copy it yourself.
Editing input or changing settings clears the old result, copy status and feedback eligibility. Clear removes input and output and keeps your settings. Text stays in this page’s memory and clears when you leave or refresh. Copy it before opening another tool.
URL component or form value?
a b+c → a%20b%2Bc in URL component mode.
a b+c → a+b%2Bc in form value mode.
URL component uses encodeURIComponent: ASCII letters, digits and - _ . ! ~ * ' ( ) stay unescaped. A space becomes %20; a literal + becomes %2B. Decoding leaves a raw + unchanged. This is not strict RFC 3986 encoding.
Form value encodes a single application/x-www-form-urlencoded value, not a set of fields. ASCII letters, digits and * - . _ stay unescaped. A space becomes +; a literal + becomes %2B. Decoding changes raw + to a space before percent decoding, so %2B still becomes +.
A complete URL is treated as one string. Encoding escapes its structure separators, including : / ? & = #, rather than preserving a clickable URL. The result is plain text; no URL is opened or fetched.
Strict UTF-8 decoding and limits
Strict decoding: malformed percent escapes and invalid UTF-8 are rejected. Each % needs two hexadecimal digits, with either letter case accepted. Overlong encodings, surrogate bytes, values above U+10FFFF and truncated sequences fail instead of producing replacement characters. Raw Unicode is allowed; unpaired surrogates are rejected in both directions.
Decoding happens once: %252F becomes %2F, not /. Parameters are not split at & or =. Form decoding uses the form value plus convention but is stricter than the WHATWG form parser, which can replace malformed bytes. There is no recursive decoding, file upload, character-set detection or full URI mode.
Input is limited to 200,000 UTF-16 code units; output is limited to 1,800,000 UTF-16 code units. An emoji may use two input units. Over-limit input is preserved and rejected without truncation. A large encoded output can exceed the decode input limit, so the largest encoded result cannot always be pasted back here.
The core preserves BOM (U+FEFF), NUL, CRLF, LF and CR without trimming or Unicode normalization. Browser textarea input and display may normalize line breaks to LF. Conversion uses the current input textarea value; Copy result uses raw output, while manual selection may normalize line breaks. The operating system or paste target may also change them.
Conversion stays local. Optional analytics use fixed categories; feedback and support only send data when you actively submit or open them. Read about privacy and optional analytics.
For other text formats, open the Base64 text tool or JSON formatter. To inspect supported invisible characters, open Inspect & Clean. Content is never transferred automatically.
Last reviewed: 2026-10-24