2009-09-03 12 views
76

Estoy PUBLICANDO los contenidos de un campo de formulario a través de AJAX a un script PHP y usando JavaScript al escape(field_contents). El problema es que los signos más se eliminan y se reemplazan por espacios. ¿Cómo puedo 'codificar' de forma segura el signo más y luego 'decodificarlo' adecuadamente en el lado de PHP?AJAX POST y signo Plus (+) - ¿Cómo codificar?

+0

para aclarar, estaba usando escape (field_contents), no codificar – jalperin

Respuesta

113

Use encodeURIComponent() en JS y en PHP debería recibir los valores correctos.

Nota: Cuando accede a $_GET, $_POST o $_REQUEST en PHP, está recuperando valores que ya han sido descodificados.

Ejemplo:

En sus 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 

en su servidor:

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

Es sólo la petición HTTP prima que contiene los datos de URL codificada.

Para una solicitud GET, puede obtener esto del URI. $_SERVER['REQUEST_URI'] o $_SERVER['QUERY_STRING']. Para un puesto urlencoded, file_get_contents('php://stdin')

NB:

decode() sólo funciona para los caracteres de un solo byte codificado. No funcionará para toda la gama UTF-8.

por ejemplo:

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

Nota: "%C4%80" es equivalente a: escape('\xc4\x80')

que es la secuencia de bytes (\xc4\x80) que representa una en UTF-8. Entonces, si usa encodeURIComponent(), su lado del servidor debe saber que está recibiendo UTF-8. De lo contrario, PHP destruirá la codificación.

+0

Una continuación: cuando codigoURIComponent (texto) y texto incluye caracteres como la cita inteligente (&rsqo;), la secuencia de comandos php parece ver caracteres no deseados. Supongo que es un problema de juego de caracteres, pero no sé cómo resolverlo. Estoy haciendo el AJAX POST con "Content-Type": "application/x-www-form-urlencoded; charset = UTF-8", y estoy usando PHP5 en el lado del servidor. – jalperin

+0

¿Cómo ves estos personajes? Debes asegurarte de que el navegador sepa que es UTF-8. En HTML puede configurar '' o '' también puede configurarlo en PHP con el encabezado HTTP de tipo de contenido.'header ('Content-Type: text/html; charset = UTF-8');' PS: &rsqo; no se decodifica en el navegador (FF3.5). – bucabay

+1

¡¡¡Los amo muchachos !!! siempre me ayudas !! :) – Alejandra

15

En JavaScript tratar:

encodeURIComponent() 

y en PHP:

urldecode($_POST['field']); 
+7

encodeURIComponent es la respuesta correcta, pero como genera datos codificados en URL y no en datos codificados en HTML, html_entity_encode está apagado. – Quentin

5

El valor hexadecimal que busca es %2B

conseguirlo automáticamente en PHP ejecutar su cadena a través de urlencode($stringVal) . Y luego ejecutarlo a través de urldecode($stringVal) para recuperarlo.

Si desea que el JavaScript para manejarlo, utilice escape(str)

Editar

Después @ bobince de comentario que hice más lectura y que es correcto. Use encodeURIComponent(str) y decodeURIComponent(str). Escape no convertirá los caracteres, solo los escapará con \

+1

* No * use 'escape' (o' unescape') en JavaScript; no son lo mismo que la codificación URL y se irán mal para + y cualquier carácter no ASCII Unicode. encodeURIComponent/decodeURIComponent es casi siempre lo que quieres. – bobince

1

Si tiene que hacer un curl en php, debe usar urlencode() de PHP pero de forma individual.

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

Si lo hace urlencode(strPOST), que le llevará otro problema, tendrá una Elemento1 y & estará% valor xx cambio y ser como un solo valor, consulte aquí el regreso!

Ejemplo 1

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

Ejemplo 2

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

Ejemplo 1 es la buena manera de preparar la secuencia para POST en rizo

Ejemplo 2 muestran que el receptor no podrá ver el igual y el signo y para distinguir ambos valores!

0

mi problema era con los acentos (A e s) y el signo más (+) cuando i para tratar de salvar javascript "ejemplos de código" a MySQL:

mi solución (no la mejor manera, pero obras):

javascript:

function replaceAll(text, busca, reemplaza){ 
    while (text.toString().indexOf(busca) != -1) 
    text = text.toString().replace(busca,reemplaza);return text; 
} 


function cleanCode(cod){ 
code = replaceAll(cod , "|", "{1}"); // error | palos de explode en java 
code = replaceAll(code, "+", "{0}"); // error con los signos mas 
return code; 
} 

función para guardar:

function save(pid,code){ 
code = cleanCode(code); // fix sign + and | 
code = escape(code); // fix accents 
var url = 'editor.php'; 
var variables = 'op=save'; 
var myData = variables +'&code='+ code +'&pid='+ pid +'&newdate=' +(new Date()).getTime();  
var result = null; 
$.ajax({ 
datatype : "html", 
data: myData, 
url: url, 
success : function(result) { 
    alert(result); // result ok      
}, 
}); 
} // end function 

fu nción en php:

<?php 
function save($pid,$code){ 
    $code= preg_replace("[\{1\}]","|",$code); 
    $code= preg_replace("[\{0\}]","+",$code); 
    mysql_query("update table set code= '" . mysql_real_escape_string($code) . "' where pid='$pid'"); 
} 
?> 
3

para que sea más interesante y para permitir espero menos de arrancarse el cabello de otra persona. Usando python, diccionario integrado para un dispositivo que podemos usar curl para configurar.

Problema: {"timezone":"+5"} //throws an error " 5"

Solución: {"timezone":"%2B"+"5"} //Works

Así, en pocas palabras:

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

Gracias a este post!