Encode or decode any URL. See exactly what changed.

Paste a URL or a query value — get percent-encoding both ways, with a live breakdown of every character. Free, no sign-up, nothing uploaded.

  • Free, no sign-up
  • Runs entirely in your browser
  • Full URL & component modes
  • Live character breakdown

Encode or decode a URL

Character breakdown

Type or paste something above to see every character explained here.

Nothing to break down yet.

CharacterCode pointUTF-8 bytesBecomesActionWhy
Try an example

Examples load into the tool so you can see the breakdown change with each mode.

Quick rules
  • Space becomes %20 — or + only in form data.
  • é is two UTF-8 bytes, so it becomes %C3%A9.
  • An emoji is four bytes: 😀 → %F0%9F%98%80.
  • % itself encodes to %25 — that is how double encoding starts.
  • Encoding is not encryption: anyone can decode it in one step.

Privacy you can verify, not just trust

URLs routinely carry API keys, tokens, and session IDs, so pasting one into a random encoder is a real risk. This one can't leak yours: the encoder runs entirely in your browser. Your text is never sent anywhere — the only requests to other sites are the site's own analytics, which count page views — and it uploads nothing, ever. Don't take our word for it:

External requests during processing: 0
  1. Press F12 to open developer tools, then the Network tab.
  2. Encode or decode anything above. Watch: apart from the site's analytics, nothing is requested — no uploads, and no text ever leaves your device.
  3. Extra credit: disconnect your internet after this page loads — encoding still works.

What is URL encoding (percent-encoding)?

A URL may only be written with a small set of ASCII characters. Everything else — spaces, punctuation with a job to do, and every non-English letter — has to be rewritten before the link is safe to send. Percent-encoding is that rewrite: take the character, convert it to bytes (UTF-8 for anything non-ASCII), and write each byte as a % sign followed by two hexadecimal digits. A space is one byte, so it becomes %20. é is two UTF-8 bytes, C3 A9, so it becomes %C3%A9. An emoji is four bytes, so 😀 becomes %F0%9F%98%80. Decoding reverses the process, one percent sequence at a time. The rule comes from RFC 3986, the standard that defines what a URI is allowed to contain.

Which characters get encoded?

RFC 3986 splits ASCII into three groups. The unreserved characters — A–Z, a–z, 0–9, and - . _ ~ — are never encoded, in any mode. The reserved characters — : / ? # [ ] @ ! $ & ' ( ) * + , ; = — have a job in a URL's structure: ? starts the query, & separates parameters, # starts the fragment. Whether they get encoded depends on context: inside a single value they are data and must be escaped, but in a whole URL they are structure and must be left alone. That is exactly what the two modes above do. Everything else — spaces, < > " { } | \ ^ `, control characters, and all non-ASCII text — is encoded in both modes. And the % sign itself is always encoded as %25, because an unencoded % would look like the start of an escape.

encodeURI vs encodeURIComponent — a real example

JavaScript has two built-in functions, and picking the wrong one is the most common URL encoding bug on the web. Take this link, where the search term itself contains an ampersand:

https://example.com/search?q=black & white#top

encodeURI() encodes the whole URL but keeps its structure characters, so the link stays a link — the spaces become %20, but the ?, =, and # survive:

https://example.com/search?q=black%20&%20white#top

Notice the trap: the & also survived, so a server reads q=black%20 and then a second, empty parameter — the search term is silently cut in half. encodeURI assumes the URL is already correctly structured; it does not protect a value that contains structure characters.

encodeURIComponent() does the opposite. Applied to the whole URL it escapes everything, including :// and ?, and the link is destroyed:

https%3A%2F%2Fexample.com%2Fsearch%3Fq%3Dblack%20%26%20white%23top

The correct pattern is to encode the value only, then build the URL around it:

encodeURIComponent("black & white")  // black%20%26%20white
https://example.com/search?q=black%20%26%20white

That is why this tool has two modes: Full URL is encodeURI, Component is encodeURIComponent. Switch between them on the same input and watch the breakdown change — it shows exactly which characters each mode keeps and which it escapes.

When to use each mode

Use Full URL when you paste a complete link that must stay clickable: a long address copied from an email, a redirect URL you are pasting into a form, a link with accented characters in the path. Use Component when you are building a URL from parts: a search term, a product name, a file name, or a whole address that itself goes inside another URL as a parameter value — for example a redirect_to or next parameter. If you are ever unsure, component is the safer default for values, because an unencoded & or = inside a value silently changes what the server receives.

Mistakes this tool catches

Double encoding. Encoding an already-encoded string turns %20 into %2520, because the % gets encoded to %25. It usually happens when a value passes through two layers — a framework that encodes, then a manual encode on top. Decode once to undo the extra layer, and watch for this tool's warning when it sees %25 followed by two hex digits.

Encoding a whole URL as a component. https%3A%2F%2F is a dead link, not an encoded one. If your output starts with https%3A, you picked the wrong mode — switch to Full URL.

The plus-sign trap. In HTML form data (application/x-www-form-urlencoded), a space is written as +, not %20 — and a literal plus in the data must be encoded as %2B. Outside form data, + is just a plus sign. Decoding a query string with the wrong assumption turns every + into a space or leaves real spaces as plus signs. This tool uses strict RFC 3986 rules: spaces are %20, and + stays a plus.

Assuming encoding is security. Percent-encoding hides nothing — anyone can decode it in one step — and it does not make a link safe. A decoded address can still point to a phishing page. Encoding is a transport format, not a cipher.

Honest limitations

Encoding is not encryption

Anyone can decode %20 back to a space. Never encode a password, token, or secret and treat it as hidden — browsers, proxies, and server logs store the full URL.

Domains are a different system

A domain with accents, like café.shop, is not percent-encoded — it is converted to punycode (xn--caf-dma.shop). This tool encodes text and URL parts, not hostnames.

Invalid sequences are rejected, not guessed

A lone %, %2, or %GG is not a valid escape, and %FF is not valid UTF-8. The tool reports the exact position instead of silently dropping the character or guessing what you meant.

Decoding does not make a link safe

Decoding only reveals what an encoded link says. Check the destination domain before you open it — especially links from emails, logs, or analytics exports.

Frequently asked questions

How do I encode a URL without uploading it anywhere?

Paste it into the tool above. Encoding runs in your browser with the built-in JavaScript functions encodeURI and encodeURIComponent — your text is never sent anywhere. The only requests to other sites are the site's own analytics, which count page views. You can verify that in your browser's Network tab, or disconnect from the internet and keep encoding.

What is the difference between encodeURI and encodeURIComponent?

encodeURI encodes a complete URL and keeps the characters that give it structure — : / ? # & = and friends — untouched, so the link still works. encodeURIComponent encodes a single value and escapes those characters too, because inside a value they are data, not structure. Use encodeURI for a whole link and encodeURIComponent for a query value. For example, encodeURIComponent("black & white") gives black%20%26%20white, while encodeURI leaves the & alone.

Should I encode a full URL or just the query value?

Encode just the value, then put it into the URL. Encoding a whole URL as if it were a single component turns :// into %3A%2F%2F and ? into %3F, and the link stops working. The correct pattern is: encode the value (for example a search term or a redirect address) with the component mode, then build the URL around it — https://example.com/search?q= plus the encoded value.

Why did my URL get double-encoded — %2520 instead of %20?

It was encoded twice. The first pass turned a space into %20; the second pass saw the % sign and encoded it as %25, producing %2520. Decode once to undo the extra layer — decoding %2520 gives back %20. This tool warns you when it spots %25 followed by two hex digits, which is the tell-tale sign of double encoding.

Does URL encoding hide my data or make a link safe to click?

No. Percent-encoding is a way of writing characters, not a cipher — anyone can decode %20 back to a space in one step, and browsers, proxies, and server logs store the full URL. Decoding a link also does not make it safe: a decoded address can still point to a phishing page or a download you do not want. Always check the destination domain before you open a decoded link.