web-dev-qa-db-fra.com

AJAX POST et signe plus (+) - Comment encoder?

Je poste le contenu d'un champ de formulaire via AJAX à un script PHP et en utilisant JavaScript pour escape(field_contents)). _. Le problème est que tous les signes plus sont supprimés et remplacés par des espaces.Comment puis-je "encoder" en toute sécurité, puis le "décoder" de manière appropriée du côté PHP?)?

89
jalperin

Utilisez encodeURIComponent() dans JS et dans PHP vous devriez recevoir les valeurs correctes.

Remarque: lorsque vous accédez à $_GET, $_POST Ou $_REQUEST En PHP, vous récupérez des valeurs qui ont déjà été décodées.

Exemple:

Dans votre JS:

// url encode your string
var string = encodeURIComponent('+'); // "%2B"
// send it to your server
window.location = 'http://example.com/?string='+string; // http://example.com/?string=%2B

Sur votre serveur:

echo $_GET['string']; // "+"

Seule la requête HTTP brute contient les données encodées dans l'URL.

Pour une demande GET, vous pouvez récupérer cela à partir de URI. $_SERVER['REQUEST_URI'] Ou $_SERVER['QUERY_STRING']. Pour un POST codé en url, file_get_contents('php://stdin')

NB:

decode() ne fonctionne qu'avec les caractères codés sur un octet. Cela ne fonctionnera pas pour toute la gamme UTF-8.

par exemple:

text = "\u0100"; // Ā
// incorrect
escape(text); // %u0100 
// correct
encodeURIComponent(text); // "%C4%80"

Remarque: "%C4%80" Équivaut à: escape('\xc4\x80')

Quelle est la séquence d'octets (\xc4\x80) Qui représente Ā Dans UTF-8. Donc, si vous utilisez encodeURIComponent(), votre serveur doit savoir qu'il reçoit le format UTF-8. Sinon PHP modifiera l'encodage.

136
bucabay

En JavaScript, essayez:

encodeURIComponent() 

et en PHP:

urldecode($_POST['field']);
17
Deniss Kozlovs

Pour rendre cela plus intéressant et permettre, espérons-le, moins de tirer les cheveux pour quelqu'un d'autre. Utilisation de python, dictionnaire construit pour un périphérique que nous pouvons utiliser curl pour configurer.

Problème: {"timezone":"+5"} //throws an error " 5"

Solution: {"timezone":"%2B"+"5"} //Works

Donc, en quelques mots:

var = {"timezone":"%2B"+"5"}
json = JSONEncoder().encode(var)
subprocess.call(["curl",ipaddress,"-XPUT","-d","data="+json])

Merci à ce post!

4
Pawr

La valeur hexadécimale que vous recherchez est %2B

Pour l'obtenir automatiquement dans PHP, exécutez votre chaîne via urlencode($stringVal). _), Puis exécutez-la bien urldecode($stringVal) pour la récupérer.

Si vous voulez que le JavaScript le gère, utilisez escape( str )

Éditer

Après le commentaire de @ bobince, j'ai lu davantage et il a raison. Utilisez encodeURIComponent(str) et decodeURIComponent(str). Echap ne convertira pas les caractères, seulement les échappera avec \

4
Rob Allen

Si vous devez faire un curl en php, vous devez utiliser urlencode() de PHP mais individuellement!

strPOST = "Item1=" . $Value1 . "&Item2=" . urlencode("+")

Si vous faites urlencode(strPOST), vous apporterez un autre problème, vous aurez un élément1 et & changera la valeur% xx et sera comme une valeur, voir ici le retour!

Exemple 1

$strPOST = "Item1=" . $Value1 . "&Item2=" . urlencode("+") will give Item1=Value1&Item2=%2B

Exemple 2

$strPOST = urlencode("Item1=" . $Value1 . "&Item2=+") will give Item1%3DValue1%26Item2%3D%2B

L’exemple 1 est le bon moyen de préparer une chaîne pour POST in curl

L'exemple 2 montre que le récepteur ne verra pas l'égalité et l'esperluette pour distinguer les deux valeurs!

0
Marc