Decode a URL-encoded list

Paste URL-encoded items, one per line, and get each decoded to readable text. Uses `decodeURIComponent` per line, so `%20` becomes space, `%C3%A9` becomes `é`, and other percent-escapes resolve correctly. This decodes percent-escapes only - a `+` stays as `+`, so form-urlencoded bodies (where spaces were encoded as `+`) need one extra step via Replace to swap `+` for space. Malformed items pass through unchanged rather than throwing.

Input
Ready
Output
Live

A per-line URL decoder

The tool applies `decodeURIComponent` to every non-blank line independently. `%20` becomes space, `%26` becomes `&`, `%2F` becomes `/`, and multi-byte UTF-8 sequences (`%C3%A9` = `é`, `%F0%9F%98%80` = 😀) reconstruct correctly. Use on URL fragments, query-string values, or path segments - anywhere percent-escapes are the only encoding. For `application/x-www-form-urlencoded` bodies this is a partial decode: percent-escapes resolve here, but the `+` → space convention used by form encoders needs a second pass (see the next paragraph).

If `decodeURIComponent` throws on a particular line (usually an orphan `%` or an invalid percent sequence like `%XY`), the tool catches the error and returns the line unchanged. That keeps partial data usable - you will see the broken line standing out among the cleanly decoded ones.

There are no options because `decodeURIComponent` is agnostic about encoding flavour. It reverses the output of Query mode and Path mode from the encoder directly. For Form-mode output (where spaces became `+`), the `+` stays as `+` in the decode - swap `+` for space separately if you need that.

How to use decode a url-encoded list

  1. 1Paste your URL-encoded lines into the input panel
  2. 2Output is each line decoded, one per line
  3. 3Malformed lines pass through unchanged so you can spot them
  4. 4No options to configure - decoding is `decodeURIComponent` per line
  5. 5Pair with encode-a-list-as-a-url-string to round-trip

Keyboard shortcuts

Drive ListShift without touching the mouse.

Shortcut Action
Ctrl ZUndo last input change
Ctrl Shift ZRedo
Ctrl Shift EnterToggle fullscreen focus on the editor
EscExit fullscreen
Ctrl KOpen the command palette to jump to any tool
Ctrl SSave current pipeline draft Plus
Ctrl PRun a saved pipeline Plus

What this decoder actually does

Per-line `decodeURIComponent` with error recovery.

Browser-native `decodeURIComponent`

Each line goes through the browser's `decodeURIComponent` function - the spec-compliant inverse of `encodeURIComponent`. Every standard percent-escape resolves correctly.

Unicode via multi-byte UTF-8

Percent-encoded UTF-8 byte sequences reconstruct to their original characters. `caf%C3%A9` → `café`, `%F0%9F%98%80` → `😀`. Works for any Unicode code point, including emoji and non-Latin scripts.

Malformed input passes through

Orphan `%` characters or invalid sequences like `%XY` would normally throw. The tool catches the error and returns the raw line unchanged, so you see the broken item in the output rather than a crash or an empty result.

Does not swap `+` back to space

`decodeURIComponent` treats `+` as a literal `+`, not space. If your source was Form-encoded (spaces as `+`), you will get `hello+world` back. Run Replace after this tool to swap `+` for space if needed.

Runs in your browser

Decoding happens client-side - useful when the URLs you are decoding contain auth tokens, internal IDs, or tracking parameters you would not paste into a public decoder.

Worked example

Every standard percent-escape resolves, including multi-byte UTF-8 and escaped slashes.

Input
hello%20world
green%20%26%20blue
caf%C3%A9%20au%20lait
path%2Fwith%2Fslashes
Output
hello world
green & blue
café au lait
path/with/slashes

Behavior reference

No user options. These are the fixed rules the decoder applies.

Rule What it does Example
Per-line decode Each line runs through `decodeURIComponent` independently Four input lines → four output lines
UTF-8 reconstruction Multi-byte percent sequences combine into the original character `%C3%A9` → `é`; `%F0%9F%98%80` → 😀
`+` is literal, not space Matches `decodeURIComponent` behaviour - not Form-mode decoding `hello+world` stays as `hello+world`
Malformed input recovery Invalid sequences return the raw line unchanged `%XY` or orphan `%` pass through, no crash

FAQ

What happens with malformed percent sequences like `%XY`?
`decodeURIComponent` throws on invalid sequences, but the tool catches the error and returns the raw line unchanged. You will see the malformed line stand out among the cleanly decoded ones, so you can fix it in the source.
Does this decode `+` to space?
No. `decodeURIComponent` treats `+` as literal `+`. If your source was encoded with the Form convention (spaces as `+`), decode here first and then run Replace to swap `+` for space.
Does it decode unicode / emoji correctly?
Yes. Multi-byte UTF-8 percent sequences are reassembled into the original character. `caf%C3%A9` decodes to `café`, `%F0%9F%98%80` decodes to 😀.
Why are there no options?
`decodeURIComponent` is agnostic about the encoding flavour used on the way in. It correctly reverses Query-mode and Path-mode output from the encoder. Form-mode input needs one extra step (`+` → space); Fragment-mode input decodes without issue too, since any character `encodeURI` preserved is already a literal the decoder handles.
Can I encode a list as URL-safe text?
Yes, use encode-a-list-as-a-url-string - four encoding modes for four URL contexts (query string, form body, URL path segment, fragment).