Home / All tools / URL Encoder & Decoder
Browser-local conversion

Keep the meaning. Change the representation.

Encode a component, preserve a complete URI, decode percent escapes, or inspect a URL you already understand. Nothing entered here is fetched or sent by this page.

Local by design: This utility transforms text in your browser. It does not open, validate, or retrieve the destination.

Abstract paper route lines and percent tokens arranged with stationery on an ivory desk Toolyfi

URL Encoder & Decoder

Choose what the text represents first. A component and a complete URI have different separators to preserve.

Use this for data that belongs inside one URI component, such as a query parameter value. Structural characters become data.

Input0 characters
Output0 characters

Ready for a local conversion.

0INPUT CHARACTERS
0OUTPUT CHARACTERS
0PERCENT ESCAPES
SIZE CHANGE

Small encoding choice. Big structural difference.

Component mode treats separators like &, =, /, and ? as data. Full URI mode leaves those separators available to describe a scheme, path, query, and fragment. The tool intentionally shows the method you selected instead of guessing your intent.

Practical guide · URL encoding

Use URL encoding to preserve data without confusing the structure around it

A URL encoder is easy to treat as a text cleaner: paste a string, click a button, and accept whatever symbols appear. That approach works until the text has a role. A URL can contain structure, values, identifiers, paths, fragments, and form data. Each part has a different job. Percent encoding is not a claim that a destination is valid, safe, reachable, or suitable. It is a way to represent bytes where the relevant URI context needs a restricted character set. This Toolyfi page stays deliberately local: it changes the representation you enter but never fetches the address, follows a redirect, or checks a server response.

Start by identifying the thing you are encoding

The most important question is not “Which encoder is strongest?” It is “What does this text become next?” If the text will be one value in a query parameter, it is a component. For example, the phrase Jack & Jill needs the ampersand encoded when it is the value for q; otherwise a server may see a second parameter. If you are preparing an entire address such as https://example.test/search?q=tea, the colon, slashes, question mark, equals sign, and ampersand already carry structure. Encoding all of those signs as data would change the way the address is parsed. Native JavaScript offers separate methods for these two situations, and a useful tool should make the distinction visible rather than silently selecting one.

encodeURIComponent() is usually the appropriate first choice for user-entered fields that will be placed into a URI component. It protects characters that could otherwise become delimiters. encodeURI() is less aggressive because it preserves URI syntax characters in a complete address. Neither method is a universal repair tool. If an API asks for a particular serialization, a server-specific signing rule, or a form body, follow that contract. The result from a general utility is an inspection aid and a representation helper, not a substitute for the destination’s documentation.

What percent encoding actually represents

Percent encoding writes an octet as a percent sign followed by two hexadecimal digits. A familiar example is a space written as %20. For Unicode text, the browser first represents the character using UTF-8 bytes and then writes each byte as an escape. This is why a single visible character can become several percent escapes. The output may look longer, but its role is not to be readable in isolation; it is to keep data separate from URI delimiters and make the intended bytes transportable in the relevant context.

RFC 3986 distinguishes unreserved characters from reserved characters. Letters, digits, hyphens, periods, underscores, and tildes are normally safe as literal data. Reserved characters can have a structural purpose depending on where they appear. A slash may divide path segments; a question mark may start a query; a hash may begin a fragment. The same character can be data in one place and syntax in another. That context is why this page has an RFC 3986 component option rather than presenting one string as “the correct encoded URL” for every use case.

Encoding changes how text is represented in a URI context. It does not make an unfamiliar destination trustworthy, and it does not prove that a server will accept a particular request.

Component encoding and full URI encoding are not interchangeable

Consider a site search. If a person searches for red & blue, the intended value contains an ampersand. A component encoder turns that ampersand into data, allowing the application to keep it inside one parameter value. If the application concatenates plain text instead, the ampersand may split the query into unexpected fields. This is an integrity problem, not merely a cosmetic one. Encoding at the boundary where data is inserted is simpler and safer than trying to repair a finished URL after its parts have become ambiguous.

Now consider a completed URI: https://example.test/find?q=red%20blue#notes. It already has a scheme, authority, path, query, and fragment. An entire-URI encoder preserves its delimiters so that the shape remains visible to a URI parser. It can encode spaces and non-ASCII characters without turning the separator between q and its value into data. Do not use a whole-URI method for a raw value simply because the output appears shorter. The shortest representation is not the criterion; preserving the correct structure is.

Decode carefully because failure is useful information

Decoding is not guaranteed to succeed. A standalone percent sign, a percent sign followed by non-hexadecimal characters, or an invalid UTF-8 byte sequence can cause a native decoder to throw a URI error. Some tools quietly replace characters or remove a malformed escape. That may be convenient for a display, but it can also hide the exact data problem you need to resolve. Toolyfi leaves the input untouched and shows a clear local error message. Copy the error context, inspect the percent escapes, and return to the source system if you need to know what representation was intended.

A repeated decode can also change meaning. A value such as %252F decodes once to %2F and twice to a slash. Whether a second decode is correct depends on how many layers of serialization have occurred in the system that produced the value. Do not keep decoding until the string “looks normal.” Record the source, the expected field type, and the number of transformations applied. A controlled one-step operation is easier to audit than an accidental chain of conversions.

Plus signs belong to a separate form convention

One common source of confusion is the plus sign. Generic URI percent encoding uses %20 for a space. HTML form serialization under application/x-www-form-urlencoded commonly uses + for a space in a form value. Those conventions overlap often enough that people treat them as identical, but they are not identical. A literal plus can be meaningful data. Replacing every plus sign with a space before a generic decode could damage that data.

For that reason, the page includes an explicit “Decode form value” mode. It first treats plus signs as spaces and then decodes the value. Use it only when you know the string came from a form-style field or query serialization that follows that convention. For a generic component or complete URI, use the normal decoder and preserve plus signs unless the relevant specification says otherwise. Naming the mode makes the choice reviewable for the next person who reads the output.

Unicode, emoji, and malformed text

Modern browser methods handle ordinary Unicode text, including accented letters and many emoji, by working from UTF-8 sequences. A value such as café becomes a short sequence with the encoded byte values for the accented character. A visual emoji can require multiple code units and several bytes. That length increase is expected and does not mean the text has been corrupted. The useful test is whether one appropriate encode followed by one matching decode returns the original well-formed string.

There is an edge case worth keeping in mind when text comes from a low-level source: a lone UTF-16 surrogate code unit. Native encode methods can reject it because it does not form a valid Unicode scalar value. The page reports that error rather than silently deciding how to repair it. If your application owns the input pipeline, normalize or validate text at the right boundary and document the decision. If you are investigating third-party data, keep a copy of the original and seek a source-specific explanation before replacing bytes.

Use the local inspection panel as a reading aid

When the current input can be parsed as a complete absolute URL, Toolyfi shows a local breakdown of the protocol, host, path, query, and fragment. Query parameters appear as decoded key/value pairs. This panel does not make any network request. It simply uses the browser’s URL parser to display what a complete address contains. It is useful for checking whether a value landed in the parameter you expected or whether an encoded separator has become part of the path.

Parsing is not the same as validation. A browser can parse a syntactically shaped address even if its host does not exist, its service is unavailable, or its destination is unsafe. Treat the panel as a structural lens. Before opening a link, independently consider the domain spelling, the channel that supplied it, the permissions it requests, and whether sensitive information might be exposed. If a link concerns an account, payment, identity, health, or a professional decision, use the organization’s verified route rather than relying on a decoded string alone.

Build URLs from parts instead of concatenating guesses

In application code, it is often better to use APIs that understand URL structure than to assemble a query with manual string concatenation. The browser’s URL and URLSearchParams interfaces can help you separate a base address from parameter names and values. Add a value through the appropriate API, inspect the generated URL, and test the exact result that will be sent. This does not remove the need to understand encoding, but it reduces the chance that one delimiter is accidentally treated as user data or one user value is accidentally treated as a delimiter.

When you do need a text utility, write down the contract in a small sentence: “This field is a query value,” “This is a complete callback URI,” or “This comes from a form body.” Choose the mode that follows that statement, preserve the original input, and use Swap to test the inverse operation. A quick round trip will not prove that a remote service behaves correctly, but it can reveal a mismatch between the representation you produced and the representation you expected.

Respect security and privacy boundaries

URL encoding is sometimes mentioned alongside injection prevention, but it is only one context-specific representation step. It is not HTML escaping, SQL parameterization, command escaping, authentication, authorization, malware scanning, or a complete input-validation strategy. Use the output only in the URI context it was prepared for. When data crosses into a different context, use that context’s correct mechanism. For example, a value safe in a URL query is not automatically safe to insert as HTML or execute as a command.

This tool performs no external fetches, so it is appropriate for reviewing a draft link, a non-secret example, or a value you want to transform locally. Still, take care with secrets. URLs can contain tokens, reset links, document identifiers, account data, and search terms. Avoid sharing them in screenshots, chat messages, or public issue trackers. If a token may have been exposed, follow the issuing service’s documented rotation or revocation process rather than assuming percent encoding concealed the value.

Think about normalization before comparing two addresses

Two strings can look different while naming the same practical resource, and two similar-looking strings can behave differently at a particular service. Case rules, default ports, trailing slashes, dot segments, percent escapes, query ordering, and fragments can all affect a comparison. Generic URI syntax explains broad concepts, but an individual protocol or application can define additional comparison and normalization rules. Do not use a visual “looks the same” test as a production identity check. Write down the exact comparison rule required by the system you are working with.

Percent-encoding case is a simple example. The hexadecimal digits in an escape are commonly rendered in uppercase, but code should not rely on a string’s visual casing alone where specifications define equivalence. A more important example is decoding an encoded reserved character. An encoded slash can be data inside one component; decoding it too early can turn it into a path separator. That means a normalization step must be applied only in the layer that understands the component’s meaning. The right workflow is not “decode everything”; it is “preserve the structure until the responsible layer is ready to interpret it.”

When debugging a mismatch, compare components one at a time. Record the scheme, host, port, path, each query key and value, and fragment separately. Identify where an application constructed the value and where it serialized it. If a proxy, framework, analytics tag, redirect system, or API client touches the URL afterward, check each boundary. The smallest repeatable sample is usually more useful than a large production address because it reveals which delimiter or byte changed. A local converter helps you produce the sample; system logs and specifications explain the end-to-end behavior.

Preserve delimiter intent in paths, queries, and fragments

Paths, queries, and fragments all use familiar punctuation, yet they have different roles. A slash can divide path segments. An ampersand and equals sign often separate query fields. A hash introduces a fragment that a browser may handle locally after the rest of the URI is resolved. If a user-controlled string is intended to be a value inside any one of these regions, encode it as a component before inserting it. If your program receives an already-complete address, preserve its existing separators while you inspect it. The distinction makes route handling more predictable and avoids accidentally creating new fields or path segments.

Query values deserve particular care because they are often assembled from search text, filters, callbacks, and identifiers. Use a structured parameter API when possible. If you must manually inspect a result, test values containing spaces, a literal plus, an ampersand, an equals sign, a slash, a question mark, a hash, and one Unicode character. Each test checks a different assumption. A correct output for a space does not prove correct output for an ampersand, and a correct output for one form convention does not prove that a generic URI decoder should treat plus as a space.

Fragments are also easy to misread in security reviews. A fragment is not normally sent in an HTTP request in the same way as the path and query, but client-side applications can interpret it and may use it for routing or state. Do not treat its local nature as a guarantee of safety. Follow the rules of the receiving application, avoid placing secrets in shareable URLs, and test the complete client flow with non-sensitive examples. Encoding is one small representation tool in a broader design that must include appropriate validation and authorization.

Document the boundary between display and transport

Readable text and transport representation serve different people. A human might need to see an international name, a search phrase, or a title exactly as written. A URI component might need the UTF-8 percent-encoded representation of those same characters. Keep both where your workflow allows it: retain the original for review and produce the encoded value only at the point of insertion. This makes logs, tests, and support conversations easier to understand. It also reduces the temptation to decode a stored value repeatedly just to make it readable on screen.

For user interfaces, label encoded fields clearly and provide a copy action that copies exactly what the program will use. Avoid auto-decoding a value in a way that could make it look safer, shorter, or more familiar than it is. In a developer handoff, include an example input, its expected representation, the method selected, and the component where it belongs. A future maintainer should not need to infer whether an apparent plus sign was intentional data or a form-style space.

Local transformations are especially helpful when you need to explain a result without giving a third party access to a sensitive draft. This page does not submit input, keep a history, or issue a network request. That boundary is useful but it does not eliminate browser, clipboard, screen-sharing, or organizational retention risks outside the page. Treat the text you paste according to its sensitivity, minimize copies, and remove secrets from examples. Good representation hygiene includes deciding what should not be placed in a URL at all.

Test the receiver, not only the encoder

A round-trip check confirms that matching native operations can reproduce a well-formed value in the browser. It does not prove that a server, library, gateway, signing process, or framework will apply the same operation at the same time. Build tests around the actual receiving system. Include an expected request or URI in version-controlled tests, use a non-production endpoint where available, and verify the parsed value after the receiver processes it. If a tool or framework already exposes a parameter-building interface, prefer that maintained interface over custom string assembly.

When an integration fails, identify the failure layer before changing the representation. An error can come from an authorization rule, an unavailable host, a route definition, an application validator, a missing parameter, or an unexpected content type. Re-encoding an address will not solve most of those problems. Conversely, a malformed escape error is evidence that the representation itself needs attention. Keeping the categories separate prevents a debugging session from turning into repeated transformations that obscure the original input.

Use a small test ledger when an address matters to a workflow: source input, selected mode, output, receiver expectation, receiver result, and any relevant specification link. This is lightweight documentation, not bureaucracy. It gives you a reversible trail and lets another person reproduce the decision. The most dependable URL work is explicit about context: who produces the data, which component receives it, what representation is expected, and how the receiver interprets it.

A reliable debugging workflow

Start with the unmodified input and label its source. Next, decide whether it is a component, an entire URI, or a form-encoded value. Run exactly one local transform. Compare the character count, percent-escape count, and structure panel where relevant. If the output will go into an application, test it in a non-production environment using non-sensitive sample data. Keep the sample narrow enough to identify the behavior: one space, one ampersand, one slash, one non-ASCII character, and one plus sign can expose most context mistakes quickly.

If decoding fails, do not translate the failure into an invented value. Preserve the original bytes or escaped text, identify the producer, and determine whether a different charset, double encoding, truncated transport, or form convention was involved. If a URL is being signed, canonicalized, or compared by a service, check that service’s exact rules. Order, hexadecimal case, preserved delimiters, and normalization policies can matter. A general encoder gives you visibility; a protocol contract tells you what to send.

Reference sources and related reading

For the generic URI model, read RFC 3986, especially its discussion of percent encoding, reserved characters, and when to encode or decode. For the native browser method used by component mode, see MDN’s encodeURIComponent reference. Those sources explain principles; your application’s own API and framework documentation should define its required request format.

Use the tool below for representation checks, then continue with a related Toolyfi utility when the next step is text cleanup, Base64 inspection, JSON formatting, or testing a small HTML snippet. The best workflow keeps each operation narrow and reversible. You should be able to say what was encoded, where it will be used, which rule applied, and how you verified the result.

Questions, answered

URL encoding FAQ

What is URL percent encoding?

It represents bytes with a percent sign and two hexadecimal digits so data can safely appear in the relevant URI component.

When should I use encodeURIComponent?

Use it for a value inserted into a query parameter, path segment, or another individual URI component. It encodes structural characters as data.

When should I use encodeURI?

Use it for a complete URI whose structural separators should remain separators. It is not the right method for an individual query value.

Why does URL decoding fail?

Malformed percent escapes or byte sequences that do not form valid UTF-8 can make a native decoder throw. This tool leaves the input unchanged and reports the error.

Does plus mean space in a URL?

Not in generic URI percent encoding. Plus means space only in the specific application/x-www-form-urlencoded convention, so use the explicit form-value mode when appropriate.

Does this tool send my URL anywhere?

No. The page uses browser APIs to transform and inspect text locally. It does not fetch, submit, or store the text you enter.

Can I encode emoji and non-English text?

Yes. Supported Unicode text is represented through UTF-8 percent escapes. A lone surrogate code unit can still cause an explicit browser error.

What does RFC 3986 component mode change?

It additionally escapes the characters !, apostrophe, parentheses, and asterisk after component encoding for a stricter reserved-character treatment.

Can encoding prove that a URL is safe?

No. Encoding changes representation only. Inspect the domain and context before opening or sharing an unfamiliar destination.

How do I verify an encoded value?

Use Swap to move the output into the input and reverse the operation. A round trip checks representation, not remote-service behavior.