问题
This should be a simple task, but I can\'t seem to find a solution.
I have a basic string that is being passed through as a query string parameter like this one: This+is+a+message+with+spaces
. I would like to decode that parameter using JavaScript to This is a message with spaces
, but I cannot seem to get it to decode.
I\'ve tried decodeURI(\'This+is+a+message+with+spaces\')
but the result still contains the +
signs.
回答1:
Yes it is true that decodeURIComponent function doesn't convert + to space. So you have to replace the + using replace function.
Ideally the below solution works.
var str_name = 'This+is+a+message+with+spaces';
decodeURIComponent((str_name + '').replace(/\+/g, '%20'));
回答2:
Like it was pointed out already,
decodeURI
function doesn't convert +
to space, but there are some things worth to realize here:
decodeURI
is meant to be used for whole URI, i.e. it doesn't decode separators like?
,&
,=
,+
, etc.- for decoding parameters
decodeURIComponent
should be used
(worth to have a look at: What is the difference between decodeURIComponent and decodeURI? ) - string that you are trying to decode might actually contain
+
encoded as%2B
, thus you should not replace+
after the conversion since you might lost+
signs that you actually want there, e.g.something?num=%2B632+905+123+4567
should become:something?num=+632 905 123 4567
since you are probably going to extract the number:+632 905 123 4567
So the correct way to do this is:
var str = 'something?num=%2B632+905+123+4567';
decodeURIComponent( str.replace(/\+/g, '%20') );
回答3:
The plus sign is not encoded/decoded. To see the decode function working, you need to pass a encoded URI first. Take a look:
encodeURI( "http://www.foo.com/bar?foo=foo bar jar" )
Will generate: http://www.foo.com/bar?foo=foo%20bar%20jar
, i.e., the encoded URI.
decodeURI( "http://www.foo.com/bar?foo=foo%20bar%20jar" )
Will generate: http://www.foo.com/bar?foo=foo bar jar
, i.e., the decoded URI.
回答4:
The below code will decode and gives you the params in form of objects
export function getParamsFromUrl(url) {
url = decodeURI(url);
if (typeof url === 'string') {
let params = url.split('?');
let eachParamsArr = params[1].split('&');
let obj = {};
if (eachParamsArr && eachParamsArr.length) {
eachParamsArr.map(param => {
let keyValuePair = param.split('=')
let key = keyValuePair[0];
let value = keyValuePair[1];
obj[key] = value;
})
}
return obj;
}
}
回答5:
I created my own string methods to support the needed encoding/decoding. These methods will handle the + encoding and decoding properly, allowing you to have plusses (+) in your string and still have the original spaces be encoded as +'s.
String.prototype.plusEncode = function() {
return encodeURIComponent(this).replace(/\%20/gm,"+");
}
String.prototype.plusDecode = function() {
return decodeURIComponent(this.replace(/\+/gm,"%20"));
}
来源:https://stackoverflow.com/questions/12042592/decoding-url-parameters-with-javascript