URL encode / decode
Runs entirely in your browser. Your files and data never leave your device.
About this tool
Percent-encoding replaces characters that are unsafe in URLs, such as spaces, ampersands, question marks, and non-ASCII characters, with %XX escape sequences, as defined by RFC 3986. Decoding reverses that. This tool does both, and it also parses a query string into its individual key-value pairs.
What does encoding and decoding actually do here?
Paste a full URL or any piece of text and this tool encodes or decodes it using the same encodeURIComponent and decodeURIComponent functions built into JavaScript, so the output matches what a browser or a typical web framework would produce. Decoding a string that isn’t valid percent-encoding, say one with a stray % not followed by two hex digits, produces a clear error instead of a garbled result. If you paste a full URL rather than a bare query string, the query-parsing view pulls out ?a=1&b=2 style parameters and reads it the same way; each parameter shows up on its own row, which helps when you’re checking an OAuth redirect, a tracking link, or an API call where the parameters got nested and encoded more than once.
How is this different from the URL parser tool?
This tool is for the encoding itself, converting text to and from percent-encoded form and pulling apart a query string. The separate URL parser tool goes further and breaks a full URL into every structural piece (protocol, host, port, path, and so on) using the browser’s own URL parser. Reach for this one when you need to encode a value before dropping it into a URL, or decode a query string you already have; reach for the URL parser when you need the whole URL broken down.
Does anything I paste get sent to a server?
No. All processing stays in your browser, so a URL containing a session token or personal data is never sent anywhere. One problem this tool untangles well is double-encoding, where a value gets run through encodeURIComponent twice and %20 turns into %2520. Decoding once just gets you back to %20; keep decoding until the string stops changing. See MDN’s guide to encodeURIComponent for how browsers implement this.