11548 sujets

JavaScript, DOM et API Web HTML5

extrait de code

var data = 'lib='+lib+'&menu='+menu+'&data='+articleData ; 
xhr_object.send(data);


Voici mon probleme :

ma variable "articleData" contient du texte avec des caractères spéciaux encodés (  , &, ...).

les et commerciaux posent problème.

que dois je faire?


Smiley confus Smiley confus Smiley confus Smiley confus
Salut,

Ta variable data est un morceau d'url et comme tu le sais, on ne peut pas mettre tout et n'importe quoi dans une url. Les esperluettes en particulier (les "et" commerciaux), servent à délimiter les paramètres, elles ne peuvent donc évidemment pas apparaître telles quelles à l'intérieur des paramètres mais doivent être encodées. La fonction encodeURIComponent() prend en charge l'encodage des principaux caractères "interdits", tu pourrais donc essayer :
'&data=' + encodeURIComponent(articleData)
'&' et ';' sont les deux séparateurs réservés pour les query strings CGI, et ils font partit des caractères réservés dans la RFC 3986.

Comme dit plus haut il faut échapper tes composants avec "encodeURIComponent" attention n'utilise pas "encode" qui est obselete ou "encodeURI" qui n'encode pas les délimiteurs (car il ne peut distinguer leurs usages légitime dans l'URI complète).

Pour que le résultat soit vraiment parfait - top niveau - conforme IETF il faudrait aussi utiliser le subdelimiter associé aux espaces :

encodeURIComponent(articleData).replace(/%20/g, '+');

PS : attention ta dernière string n'est pas fermée.
J'ai résolu mon problème !
avec une solution très simple

je code mes "&" et "+" de mon texte avant d'effectuer le post avec AJAX

// JS
articleData = articleData.replace(/&/g,'(hex26)');
articleData = articleData.replace(/+/g,'(hex2B)');


ensuite, lors de le reception des données, je decode :

//PHP
$articleData = str_replace("(hex26)", "&", $articleData) ;
$articleData = str_replace("(hex2B)", "+", $articleData) ;



Smiley cligne
C'est une très mauvaise solution tu ne prends en compte que deux caractères alors qu'il y'a une quinzaine de caractères réservés dans la RFC 3986 sans compter tout les caractères non ASCII qu'il faut recoder avec leur codepoint Unicode.

Ton programme risque de se casser au moindre caractère spécial (#, ?, =, ect).
Oui, en effet vous avez raison, la meilleur solution est d'utiliser la fonction encodeURIComponent();


'&data=' + encodeURIComponent(articleData);