用JavaScript解码URL参数

用JavaScript解码URL参数,javascript,html,forms,decoding,url-parameters,Javascript,Html,Forms,Decoding,Url Parameters,这应该是一项简单的任务,但我似乎找不到解决办法 我有一个基本字符串作为查询字符串参数传递,如下所示:this+is+a+message+带+空格。我想使用JavaScript对该参数进行解码,以这是一条带有空格的消息,但我似乎无法对其进行解码 我尝试了decodeURI('This+is+a+message+with+spaces'),但结果仍然包含+符号。加号未编码/解码。要查看decode函数的工作情况,首先需要传递一个编码的URI。看一看: encodeURI( "http://www.f

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

我有一个基本字符串作为查询字符串参数传递,如下所示:
this+is+a+message+带+空格
。我想使用JavaScript对该参数进行解码,以
这是一条带有空格的消息,但我似乎无法对其进行解码


我尝试了
decodeURI('This+is+a+message+with+spaces')
,但结果仍然包含
+
符号。

加号未编码/解码。要查看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。

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

decodeURI( "http://www.foo.com/bar?foo=foo%20bar%20jar" )
理想情况下,下面的解决方案有效

var str_name = 'This+is+a+message+with+spaces';
decodeURIComponent((str_name + '').replace(/\+/g, '%20'));

正如前面指出的,
decodeURI
函数不会将
+
转换为空格,但是这里有一些东西值得实现:
  • decodeURI
    用于整个URI,即它不解码分隔符,如
    &
    =
    +
  • 对于解码参数,应使用
    decodeURIComponent

    (值得一看:)
  • 您试图解码的字符串实际上可能包含编码为
    +
    %2B
    ,因此您不应该在转换后替换
    +
    ,因为您可能会丢失实际需要的
    +
    符号,例如
    某物?num=%2B632+905+123+4567
    应该变成:
    something?num=+6329051234567

    因为您可能要提取数字:
    +6329051234567
因此,正确的方法是:

var str = 'something?num=%2B632+905+123+4567';
decodeURIComponent( str.replace(/\+/g, '%20') );

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

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

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

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

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;
    }
}

URL需要编码才能解码;)Locrizak,
decodeURIComponent('This+is+a+message+带+spaces')
仍然返回
This+is+a+message+带+spaces
encodeURIComponent('This+is+a+message+with+spaces')
返回
This%2Bis%2Ba%2Bmessage%2bbwith%2Bspaces
。我一定错过了什么,因为我不知道这是如何解决我的问题的。这是更好的答案
encodeURIComponent
可能会选择不将空间编码到
+
,而更喜欢
%20
,但URI可能来自其他地方,
+
对于未知原因JS的
解码uricomponent
决定忽略的空间是一种完全有效的编码。