Cela devrait être une tâche simple, mais je n'arrive pas à trouver de solution.
J'ai une chaîne de base qui est transmise en tant que paramètre de chaîne de requête comme celui-ci: This+is+a+message+with+spaces
. Je voudrais décoder ce paramètre en utilisant JavaScript pour This is a message with spaces
, Mais je n'arrive pas à le faire décoder.
J'ai essayé decodeURI('This+is+a+message+with+spaces')
mais le résultat contient toujours les signes +
.
Oui, il est vrai que la fonction decodeURIComponent ne convertit pas + en espace. Vous devez donc remplacer le + à l'aide de la fonction de remplacement.
Idéalement, la solution ci-dessous fonctionne.
var str_name = 'This+is+a+message+with+spaces';
decodeURIComponent((str_name + '').replace(/\+/g, '%20'));
Le signe plus n'est pas codé/décodé. Pour voir la fonction de décodage fonctionner, vous devez d'abord passer un URI codé. Regarde:
encodeURI( "http://www.foo.com/bar?foo=foo bar jar" )
Générera: http://www.foo.com/bar?foo=foo%20bar%20jar
, c'est-à-dire l'URI codé.
decodeURI( "http://www.foo.com/bar?foo=foo%20bar%20jar" )
Générera: http://www.foo.com/bar?foo=foo bar jar
, c'est-à-dire l'URI décodé.
Le code ci-dessous va décoder et vous donne les paramètres sous forme d'objets
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;
}
}
J'ai créé mes propres méthodes de chaîne pour prendre en charge l'encodage/décodage nécessaire. Ces méthodes gèreront l'encodage et le décodage + correctement, vous permettant d'avoir des plus (+) dans votre chaîne et d'avoir toujours les espaces d'origine encodés en +.
String.prototype.plusEncode = function() {
return encodeURIComponent(this).replace(/\%20/gm,"+");
}
String.prototype.plusDecode = function() {
return decodeURIComponent(this.replace(/\+/gm,"%20"));
}