53

这应该是一项简单的任务,但我似乎找不到解决方案。

我有一个基本字符串,它作为查询字符串参数传递,如下所示:This+is+a+message+with+spaces. 我想使用 JavaScript 将该参数解码为This is a message with spaces,但我似乎无法对其进行解码。

我已经尝试过decodeURI('This+is+a+message+with+spaces'),但结果仍然包含+迹象。

4

5 回答 5

76

是的,decodeURIComponent 函数确实不会将 + 转换为空格。因此,您必须使用替换功能替换 + 。

理想情况下,以下解决方案有效。

var str_name = 'This+is+a+message+with+spaces';
decodeURIComponent((str_name + '').replace(/\+/g, '%20'));
于 2013-05-16T12:32:19.083 回答
32
就像已经指出的那样,decodeURI函数不会转换+为空间,但是这里有一些值得实现的事情:
  • decodeURI旨在用于整个 URI,即它不解码分隔符,如?, &, =,+等。
  • decodeURIComponent应该使用解码参数
    (值得一看:decodeURIComponent和decodeURI有什么区别?
  • 您尝试解码的字符串实际上可能包含+编码为%2B,因此您不应该+在转换后替换,因为您可能会丢失+您真正想要的迹象,例如something?num=%2B632+905+123+4567应该变成:
    something?num=+632 905 123 4567
    因为您可能要提取数字:+632 905 123 4567

所以正确的做法是:

var str = 'something?num=%2B632+905+123+4567';
decodeURIComponent( str.replace(/\+/g, '%20') );
于 2013-07-05T09:16:00.600 回答
27

加号未编码/解码。要查看 decode 函数是否正常工作,您需要先传递一个编码的 URI。看一看:

encodeURI( "http://www.foo.com/bar?foo=foo bar jar" )

将生成:http://www.foo.com/bar?foo=foo%20bar%20jar,即编码的URI。

decodeURI( "http://www.foo.com/bar?foo=foo%20bar%20jar" )

会生成:http://www.foo.com/bar?foo=foo bar jar,即解码后的URI。

于 2012-08-20T18:07:56.893 回答
8

下面的代码将解码并以对象的形式为您提供参数

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;
    }
}
于 2018-06-26T07:00:10.627 回答
1

我创建了自己的字符串方法来支持所需的编码/解码。这些方法将正确处理 + 编码和解码,允许您在字符串中有加号 (+) 并且仍然将原始空格编码为 +'s。

String.prototype.plusEncode = function() {
    return encodeURIComponent(this).replace(/\%20/gm,"+");
}

String.prototype.plusDecode = function() {
    return decodeURIComponent(this.replace(/\+/gm,"%20"));
}
于 2015-07-27T18:48:50.280 回答