Should I use encodeURI or encodeURIComponent for encoding URLs?

Javascript

Javascript Problem Overview


Which of these two methods should be used for encoding URLs?

Javascript Solutions


Solution 1 - Javascript

It depends on what you are actually wanting to do.

encodeURI assumes that the input is a complete URI that might have some characters which need encoding in it.

encodeURIComponent will encode everything with special meaning, so you use it for components of URIs such as

var world = "A string with symbols & characters that have special meaning?";
var uri = 'http://example.com/foo?hello=' + encodeURIComponent(world);

Solution 2 - Javascript

If you're encoding a string to put in a URL component (a querystring parameter), you should call encodeURIComponent.

If you're encoding an existing URL, call encodeURI.

Solution 3 - Javascript

xkr.us has a great discussion, with examples. To quote their summary:

> The escape() method does not encode the + character which is > interpreted as a space on the server side as well as generated by > forms with spaces in their fields. Due to this shortcoming and the > fact that this function fails to handle non-ASCII characters > correctly, you should avoid use of escape() whenever possible. The > best alternative is usually encodeURIComponent(). > > escape() will not encode: @/+ > > Use of the encodeURI() method is a bit more specialized than escape() > in that it encodes for URIs as opposed to the querystring, which is > part of a URL. Use this method when you need to encode a string to be > used for any resource that uses URIs and needs certain characters to > remain un-encoded. Note that this method does not encode the ' > character, as it is a valid character within URIs. > > encodeURI() will not encode: ~!@#$&()=:/,;?+' > > Lastly, the encodeURIComponent() method should be used in most cases > when encoding a single component of a URI. This method will encode > certain chars that would normally be recognized as special chars for > URIs so that many components may be included. Note that this method > does not encode the ' character, as it is a valid character within > URIs. > > encodeURIComponent() will not encode: ~!*()'

Solution 4 - Javascript

Here is a summary.

  1. escape() will not encode @ * _ + - . /

    Do not use it.

  2. encodeURI() will not encode A-Z a-z 0-9 ; , / ? : @ & = + $ - _ . ! ~ * ' ( ) #

    Use it when your input is a complete URL like 'https://searchexample.com/search?q=wiki';

  3. encodeURIComponent() will not encode A-Z a-z 0-9 - _ . ! ~ * ' ( ) Use it when your input is part of a complete URL e.g const queryStr = encodeURIComponent(someString)

Solution 5 - Javascript

encodeURI and encodeURIComponent are used for different purposes.
Some of the difference are

  1. encodeURI is used to encode a full URL whereas encodeURIComponent is used for encoding a URI component such as a query string.

  2. There are 11 characters which are not encoded by encodeURI, but encoded by encodeURIComponent. List:

Character encodeURI encodeURIComponent
# # %23
$ $ %24
& & %26
+ + %2B
, , %2C
/ / %2F
: : %3A
; ; %3B
= = %3D
? ? %3F
@ @ %40

Notes:
encodeURIComponent does not encode -_.!~*'(). If you want to these characters are encoded, you have to replace them with a corresponding UTF-8 sequence of characters

If you want to learn more about encodeURI and encodeURIComponent, please check the reference link. Reference Link

Solution 6 - Javascript

encodeURIComponent() : assumes that its argument is a portion (such as the protocol, hostname, path, or query string) of a URI. Therefore it escapes the punctuation characters that are used to separate the portionsof a URI.

encodeURI(): is used for encoding existing url

Solution 7 - Javascript

Difference between encodeURI and encodeURIComponent:

encodeURIComponent(value) is mainly used to encode queryString parameter values, and it encodes every applicable character in value. encodeURI ignores protocol prefix (http://) and domain name.


In very, very rare cases, when you want to implement manual encoding to encode additional characters (though they don't need to be encoded in typical cases) like: ! * , then you might use:

function fixedEncodeURIComponent(str) {
  return encodeURIComponent(str).replace(/[!*]/g, function(c) {
    return '%' + c.charCodeAt(0).toString(16);
  });
}

(source)

Solution 8 - Javascript

Other answers describe the purposes. Here are the characters each function will actually convert:

control = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F'
        + '\x10\x11\x12\x13\x14\X15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F'
                                                                    + '\x7F'
encodeURI         (control + ' "%<>[\\]^`{|}'                             )
encodeURIComponent(control + ' "%<>[\\]^`{|}' + '#$&,:;=?' + '+/@'        )
escape            (control + ' "%<>[\\]^`{|}' + '#$&,:;=?' +       "!'()~")

All characters above are converted to percent-hexadecimal codes. Space to %20, percent to %25, etc. The characters below pass through unchanged.

Here are the characters the functions will NOT convert:

pass_thru = '*-._0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'

encodeURI         (pass_thru + '#$&,:;=?' + '+/@' + "!'()~")
encodeURIComponent(pass_thru +                      "!'()~")
escape            (pass_thru +              '+/@'          )

Solution 9 - Javascript

As a general rule use encodeURIComponent. Don't be scared of the long name thinking it's more specific in it's use, to me it's the more commonly used method. Also don't be suckered into using encodeURI because you tested it and it appears to be encoding properly, it's probably not what you meant to use and even though your simple test using "Fred" in a first name field worked, you'll find later when you use more advanced text like adding an ampersand or a hashtag it will fail. You can look at the other answers for the reasons why this is.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAditya ShuklaView Question on Stackoverflow
Solution 1 - JavascriptQuentinView Answer on Stackoverflow
Solution 2 - JavascriptSLaksView Answer on Stackoverflow
Solution 3 - JavascriptBrianFreudView Answer on Stackoverflow
Solution 4 - JavascriptFrank WangView Answer on Stackoverflow
Solution 5 - JavascriptPulkit AggarwalView Answer on Stackoverflow
Solution 6 - JavascriptGopalView Answer on Stackoverflow
Solution 7 - JavascriptT.ToduaView Answer on Stackoverflow
Solution 8 - JavascriptBob SteinView Answer on Stackoverflow
Solution 9 - JavascriptPost ImpaticaView Answer on Stackoverflow