web-dev-qa-db-ja.com

JavaScriptを使用してURLパラメーターをデコードする

これは簡単な作業ですが、解決策が見つからないようです。

このようなクエリ文字列パラメーターとして渡される基本的な文字列があります:_This+is+a+message+with+spaces_。 JavaScriptを使用してそのパラメーターを_This is a message with spaces_にデコードしたいのですが、デコードさせることができないようです。

decodeURI('This+is+a+message+with+spaces')を試しましたが、結果にはまだ_+_記号が含まれています。

37
user852367

はい、decodeURIComponent関数が+をスペースに変換しないのは事実です。したがって、replace関数を使用して+を置き換える必要があります。

理想的には、以下のソリューションが機能します。

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

プラス記号はエンコード/デコードされません。デコード関数が機能することを確認するには、エンコードされた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。

19
davidbuzatto

以下のコードはデコードし、オブジェクトの形式でパラメータを提供します

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;
    }
}
4
Varsha Jadhav

必要なエンコード/デコードをサポートする独自の文字列メソッドを作成しました。これらのメソッドは、エンコードとデコードを適切に処理し、文字列にプラス記号(+)を含めることができ、元のスペースを+としてエンコードできます。

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

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