157

What's the best JavaScript URL decode utility? Encoding would be nice too and working well with jQuery is an added bonus.

3
  • 37
    Did you check encodeURIComponent and decodeURIComponent? Commented Nov 27, 2010 at 17:31
  • is that really the same thing? Commented Nov 27, 2010 at 17:35
  • @Gumbo: the same thing as URL encoding and URL decoding - blooberry.com/indexdot/html/topics/urlencoding.htm Commented Nov 27, 2010 at 17:46

9 Answers 9

239

Here is a complete function (taken from PHPJS):

function urldecode(str) {
   return decodeURIComponent((str+'').replace(/\+/g, '%20'));
}
Sign up to request clarification or add additional context in comments.

11 Comments

+1: this is the true urldecode, handles the case of space being encoded as +, thanks a lot
This is what I needed to use when the data was encoded with PHP's urlencode() function.
If I'm not mistaken, this is decoding + as %20, not as space - that's not really what you wanted here, is it? You'd want the space, not another version of an encoded character... no?
@ChrisMoschini: No, this is correct because the replace occurs before the decode call.
Thank you so much!! This is a perfect way to handle strings in jquery which have been previously urlencoded with php, just what I needed!!
|
220

I've used encodeURIComponent() and decodeURIComponent() too.

4 Comments

thanks guys! looks like the right answer, but Gumbo answered this first.. I feel like he deserves the credit
This is an incomplete answer. See the urlDecode() implementation below by @anshuman.
Nice but it didn't remove '+' signs. @anshuman's answer worked best for me
Doesn't work with spaces which are represented with ++++
9

Use this

unescape(str);

I'm not a great JS programmer, tried all, and this worked awesome!

1 Comment

Cool answer, but looks like it's obsoleted in favor of decodeURIComponent() due to poor support of non-ASCII characters.
9
decodeURIComponent(mystring);

you can get passed parameters by using this bit of code:

//parse URL to get values: var i = getUrlVars()["i"];
function getUrlVars() {
    var vars = [], hash;
    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
    for (var i = 0; i < hashes.length; i++) {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }
    return vars;
}

Or this one-liner to get the parameters:

location.search.split("your_parameter=")[1]

1 Comment

You should use window.location.search instead.
3
//How decodeURIComponent Works

function proURIDecoder(val)
{
  val=val.replace(/\+/g, '%20');
  var str=val.split("%");
  var cval=str[0];
  for (var i=1;i<str.length;i++)
  {
    cval+=String.fromCharCode(parseInt(str[i].substring(0,2),16))+str[i].substring(2);
  }

  return cval;
}

document.write(proURIDecoder(window.location.href));

1 Comment

Thank you, this worked for me. decodeURIComponent did not work for me (Malformed URI sequence).
2

If you are responsible for encoding the data in PHP using urlencode, PHP's rawurlencode works with JavaScript's decodeURIComponent without needing to replace the + character.

Comments

0

Here's what I used:

In JavaScript:

var url = "http://www.mynewsfeed.com/articles/index.php?id=17";
var encoded_url = encodeURIComponent(url);

var decoded_url = decodeURIComponent(encoded_url);

In PHP:

$url = "http://www.mynewsfeed.com/articles/index.php?id=17";
$encoded_url = url_encode(url);

$decoded_url = url_decode($encoded_url);

You can also try it online here: http://www.mynewsfeed.x10.mx/articles/index.php?id=17

Comments

0

var uri = "my test.asp?name=ståle&car=saab";
console.log(encodeURI(uri));

Comments

0

decodeURIComponent() is fine, but you never want ot use encodeURIComponent() directly. This fails to escape reserved characters like *, !, ', (, and ). Check out RFC3986, where this is defined, for more info on that. The Mozilla Developer Network documentation gives both a good explanation and a solution. Explanation...

To be more stringent in adhering to RFC 3986 (which reserves !, ', (, ), and *), even though these characters have no formalized URI delimiting uses, the following can be safely used:

Solution...

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

In case you're not sure, check out a good, working demo at JSBin.com. Compare this with a bad, working demo at JSBin.com using encodeURIComponent() directly.

Good code results:

thing%2athing%20thing%21

Bad code results from encodeURIComponent():

thing*thing%20thing!

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.