encodeURI()
is a function property of the global object.
The encodeURI()
function escapes characters by UTF-8 code units, with each octet encoded in the format %XX
, left-padded with 0 if necessary. Because lone surrogates in UTF-16 do not encode any valid Unicode character, they cause encodeURI()
to throw a URIError
.
encodeURI()
escapes all characters except:
A–Z a–z 0–9 - _ . ! ~ * ' ( )
; / ? : @ & = + $ , #
The characters on the second line are characters that may be part of the URI syntax, and are only escaped by encodeURIComponent()
. Both encodeURI()
and encodeURIComponent()
do not encode the characters -.!~*'()
, known as "unreserved marks", which do not have a reserved purpose but are allowed in a URI "as is". (See RFC2396)
The encodeURI()
function does not encode characters that have special meaning (reserved characters) for a URI. The following example shows all the parts that a URI can possibly contain. Note how certain characters are used to signify special meaning:
http://username:password@www.example.com:80/path/to/file.php?foo=316&bar=this+has+spaces#anchor
encodeURI
, as the name implies, is used to encode a URL as a whole, assuming it is already well-formed. If you want to dynamically assemble string values into a URL, you probably want to use encodeURIComponent()
on each dynamic segment instead, to avoid URL syntax characters in unwanted places.
const name = "Ben & Jerry's";
const link = encodeURI(`https://example.com/?choice=${name}`);
console.log([...new URL(link).searchParams]);
const link = encodeURI(
`https://example.com/?choice=${encodeURIComponent(name)}`,
);
console.log([...new URL(link).searchParams]);