How to URL decode
- Paste the encoded text, or a full URL, into the left box. The decoded text appears on the right as you type.
- Keep + as space on for query strings and form data; turn it off if the text contains real plus signs.
- If you paste a whole URL with a query string, the URL breakdown lists the origin, path, fragment and every parameter, decoded.
- If a
%isn't followed by two hex digits, or the bytes aren't valid UTF-8, the message shows where. Press Select it to jump to the problem.
To go the other way, use the URL encoder, or press Swap ⇄.
What %20, %3D and other codes mean
URL encoding, also called percent-encoding, writes a character as % plus its byte value in hexadecimal. Characters outside ASCII are first converted to UTF-8, so they take two to four %XX codes. The ones you will see most often:
| Code | Character | Code | Character |
|---|---|---|---|
%20 | space | %2F | slash / |
%21 | ! | %3A | colon : |
%22 | double quote " | %3B | semicolon ; |
%23 | hash # | %3D | equals sign = |
%24 | $ | %3F | question mark ? |
%25 | percent sign % | %40 | at sign @ |
%26 | ampersand & | %5B | [ |
%27 | apostrophe ' | %5D | ] |
%28 | ( | %C3%A9 | é |
%29 | ) | %E2%82%AC | € |
%2B | plus + | %F0%9F%98%80 | 😀 |
%2C | comma , |
URL decode examples
| Encoded | Decoded | Notes |
|---|---|---|
Hello%20World%21 | Hello World! | %20 is a space, %21 is ! |
caf%C3%A9+au+lait | café au lait | UTF-8 é, and + read as a space |
caf%C3%A9+au+lait | café+au+lait | Same input with “+ as space” off |
q%3Dcats%26page%3D2 | q=cats&page=2 | Encoded = and & |
name%3DJane%2520Doe | name=Jane%20Doe | Double-encoded: %25 is %, so decode twice |
Decoding a full URL and its query parameters
A query string is a list of name=value pairs joined by &. Each name and value is encoded separately, so a value can itself contain an encoded URL. Paste this link into the decoder:
https://example.com/search?q=caf%C3%A9+au+lait&tags=coffee%2Cmilk&redirect=https%3A%2F%2Fexample.org%2Fcart%3Fid%3D42#topand the breakdown shows the path /search, the fragment #top and these parameters:
| Parameter | As written | Decoded |
|---|---|---|
q | caf%C3%A9+au+lait | café au lait |
tags | coffee%2Cmilk | coffee,milk |
redirect | https%3A%2F%2Fexample.org%2Fcart%3Fid%3D42 | https://example.org/cart?id=42 |
Decoding the whole URL at once would turn the %26 and %3D inside the redirect value into real & and =, and you could no longer tell where one parameter ends. The breakdown splits the query first and then decodes each part, which is how servers read it.
decodeURI vs decodeURIComponent
JavaScript has two decoders. decodeURIComponent() decodes everything and is right for a single value. decodeURI() leaves the escapes of reserved characters (; / ? : @ & = + $ , #) alone, so the structure of a full URL doesn't change. Tick Keep %2F, %3F… (decodeURI) to get the second behaviour. For https%3A%2F%2Fexample.com%2Fsearch%3Fq%3Da%2520b:
- decodeURIComponent:
https://example.com/search?q=a%20b - decodeURI:
https%3A%2F%2Fexample.com%2Fsearch%3Fq%3Da%20b
Neither turns + into a space; that is a form-encoding rule, which is why the tool has a separate option for it.
Malformed % sequences and invalid UTF-8
Two problems make most decoders fail with “URI malformed”. This one reports them with their position and still decodes the rest:
100% sure: Malformed escape "% s" at position 4: "%" must be followed by two hex digits (0–9, A–F). A literal % is written %25.caf%E9: Invalid UTF-8 at position 4: "%E9" is not a complete UTF-8 character. The text may have been encoded in another character set (such as Latin-1) or cut off. It decodes tocaf�, where � marks the bad byte.
A %25 followed by two hex digits (like %2520) is different: it's valid, but the text was encoded twice. The decoder notices and offers a Decode again button.
URL decode in JavaScript, Python, PHP and C#
// JavaScript: + is not a space for decodeURIComponent, so replace it first for form data
decodeURIComponent("caf%C3%A9+au+lait".replace(/\+/g, " ")); // "café au lait"
new URLSearchParams("q=caf%C3%A9+au+lait").get("q"); // "café au lait"
# Python
from urllib.parse import unquote, unquote_plus, parse_qs
unquote_plus("caf%C3%A9+au+lait") # 'café au lait'
// PHP: urldecode() reads + as a space, rawurldecode() doesn't
urldecode("caf%C3%A9+au+lait");
// C#
System.Net.WebUtility.UrlDecode("caf%C3%A9+au+lait"); // + as space
Uri.UnescapeDataString("caf%C3%A9%20au%20lait");Related developer tools
- URL encoder: percent-encode text, query values or whole URLs.
- Base64 decoder: for Base64 values you find inside URLs.
- JWT decoder: for tokens passed in links and Authorization headers.
- JSON formatter: for JSON you decoded from a query parameter.
Frequently asked questions
How do I decode a URL?
Paste the URL or the encoded text into the URL decoder: every %XX sequence is replaced by the character it stands for as you type, and a full URL also gets a table of its query parameters. By hand, read each %XX as a hexadecimal byte (%41 = 65 = "A") and decode multi-byte sequences as UTF-8. In code, use decodeURIComponent() in JavaScript or urllib.parse.unquote() in Python.
What does %20 mean in a URL?
%20 is an encoded space. Spaces aren't allowed in URLs, so they are written as % followed by the character's code in hexadecimal: a space is character 32, which is 20 in hex. In query strings and form data a space is often written as + instead. Both decode to a space here when "+ as space" is ticked.
What is %3D in a URL?
%3D is an encoded equals sign (=). An unencoded = separates a parameter's name from its value, so an = that is part of a value, for example Base64 padding or a nested query string, must be written as %3D. Likewise %26 is &, %3F is ? and %2F is /.
What is URL decoding used for?
To read what a link really contains: search terms, tracking and redirect parameters, OAuth callback URLs, API query strings, file names with spaces or accents, and values in server logs. Developers also decode URLs when debugging, because a wrongly encoded value (such as a + that should have been %2B) changes what the server receives.
Should + be decoded as a space?
In query strings and form data (application/x-www-form-urlencoded), yes: browsers submit a space in a form as +, and a real + is sent as %2B. In the path of a URL and in most other text, + is just a plus sign. The "+ as space" option is on by default because most pasted URLs are query strings; turn it off when you decode a path or a value that contains literal plus signs.
Why do I get "URIError: URI malformed"?
JavaScript's decodeURIComponent() throws that error for a % that isn't followed by two hex digits (such as "100%") and for byte sequences that aren't valid UTF-8 (such as %E9, which is é in the old Latin-1 encoding). This decoder never stops on them: it decodes the rest, points to the first problem and its position, and shows how many there are.
What does %2520 mean?
%25 is the percent sign itself, so %2520 is "%20" encoded a second time. The value was URL-encoded twice, which usually means two layers of code each encoded it. Decode once to get %20 and a second time to get the space; the tool offers a "Decode again" button when it sees this.
Is URL decoding the same as Base64 decoding?
No. URL encoding (percent-encoding) only replaces unsafe characters with %XX and leaves letters and digits readable. Base64 rewrites all of the data with a 64-character alphabet. A value can be both, for example Base64 inside a query string, where the = padding appears as %3D: URL-decode it first, then use the Base64 decoder.
Is the URL I paste sent anywhere?
No. Decoding happens in JavaScript in your browser, and nothing you paste is sent to a server, logged or saved. Links often contain tokens or personal data, which is why this tool never uploads them. Only your options, such as "+ as space", are remembered on your device.