これは簡単な作業ですが、解決策が見つからないようです。
このようなクエリ文字列パラメーターとして渡される基本的な文字列があります:_This+is+a+message+with+spaces
_。 JavaScriptを使用してそのパラメーターを_This is a message with spaces
_にデコードしたいのですが、デコードさせることができないようです。
decodeURI('This+is+a+message+with+spaces')
を試しましたが、結果にはまだ_+
_記号が含まれています。
はい、decodeURIComponent関数が+をスペースに変換しないのは事実です。したがって、replace関数を使用して+を置き換える必要があります。
理想的には、以下のソリューションが機能します。
var str_name = 'This+is+a+message+with+spaces';
decodeURIComponent((str_name + '').replace(/\+/g, '%20'));
プラス記号はエンコード/デコードされません。デコード関数が機能することを確認するには、エンコードされた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。
以下のコードはデコードし、オブジェクトの形式でパラメータを提供します
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;
}
}
必要なエンコード/デコードをサポートする独自の文字列メソッドを作成しました。これらのメソッドは、エンコードとデコードを適切に処理し、文字列にプラス記号(+)を含めることができ、元のスペースを+としてエンコードできます。
String.prototype.plusEncode = function() {
return encodeURIComponent(this).replace(/\%20/gm,"+");
}
String.prototype.plusDecode = function() {
return decodeURIComponent(this.replace(/\+/gm,"%20"));
}