POST AJAX y signo más (+) - ¿Cómo codificar?

98

Estoy PUBLICANDO el contenido de un campo de formulario a través de AJAX en un script PHP y usando JavaScript para 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' apropiadamente en el lado de PHP?

jalperin
fuente
para aclarar, estaba usando escape (field_contents), no encode
jalperin

Respuestas:

156

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

Nota: Cuando accede $_GET, $_POSTo $_REQUESTen PHP, está recuperando valores que ya han sido decodificados.

Ejemplo:

En tu 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']; // "+"

Solo la solicitud HTTP sin procesar contiene los datos codificados en la URL.

Para una solicitud GET, puede recuperarla de URI. $_SERVER['REQUEST_URI']o $_SERVER['QUERY_STRING']. Para un POST con código de URL,file_get_contents('php://stdin')

NÓTESE BIEN:

decode()solo funciona para caracteres codificados de un solo byte. No funcionará para toda la gama UTF-8.

p.ej:

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

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

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

bucabay
fuente
Un seguimiento: cuando codificoURIComponent (texto) y el texto incluye caracteres como las comillas inteligentes (& rsqo;), el script php parece ver caracteres basura. 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
¿Cómo ves a estos personajes? Debe asegurarse de que el navegador sepa que es UTF-8. En HTML puede configurarlo <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">o <meta charset="UTF-8">también puede configurarlo en PHP con el Encabezado HTTP de tipo de contenido. header('Content-Type: text/html;charset=UTF-8');PD: & rsqo; no decodifica en el navegador (FF3.5).
Bucabay
5
Tuve un problema con el carácter más (+) cambiando al espacio. Todo lo demás salió bien en UTF8. Tuve buena suerte al usar encodeURIComponent (JSON.stringify (rootObject)). ¡Gracias!
zneo
Cuando encontré este problema con las contraseñas (que se recopilaron a través de una publicación de formulario de javascript), lo resolví con contraseña = encodeURIComponent (contraseña). Cuando se pasa a PHP, el valor POST codificado de la contraseña funciona correctamente.
lowcrawler
19

En JavaScript intente:

encodeURIComponent() 

y en PHP:

urldecode($_POST['field']);
Deniss Kozlovs
fuente
7
encodeURIComponent es la respuesta correcta, pero como genera datos codificados en URL y no datos codificados en HTML, html_entity_encode está muy lejos.
Quentin
1
urldecodetambién está muy lejos ya que PHP lo decodificará automáticamente antes de completar $_POST.
Quentin
5

El valor hexadecimal que busca es %2B

Para obtenerlo automáticamente en PHP, ejecute su cadena urlencode($stringVal). Y luego ejecútelo lo suficiente urldecode($stringVal)para recuperarlo.

Si desea que JavaScript lo maneje, use escape( str )

Editar

Después del comentario de @bobince, leí más y tiene razón. Utilice encodeURIComponent(str)y decodeURIComponent(str). Escape no convertirá a los personajes, solo escapar de ellos con \'s

Rob Allen
fuente
1
No use escape(o unescape) en JavaScript; no son lo mismo que la codificación de URL y funcionarán mal para + y cualquier carácter Unicode que no sea ASCII. encodeURIComponent / decodeURIComponent es casi siempre lo que desea.
Bobince el
4

Para hacerlo más interesante y, con suerte, permitir que otra persona se tire menos del cabello. Usando python, diccionario construido para un dispositivo que podemos usar curl para configurar.

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

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

Entonces, en pocas palabras:

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

¡Gracias a esta publicación!

Pawr
fuente
0

Si tiene que hacer un curl en php, ¡debe usarlo urlencode()desde PHP pero individualmente!

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

Si lo hace urlencode(strPOST), le traerá otro problema, tendrá un Item1 y & cambiará el valor% xx y será como un valor, vea aquí abajo la devolución!

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

El ejemplo 1 es la buena forma de preparar la cadena para POST en curl

¡El ejemplo 2 muestra que el receptor no verá el igual y el ampersand para distinguir ambos valores!

Bagazo
fuente
-1

mi problema fue con los acentos (á É ñ) y el signo más (+) cuando intento guardar los "ejemplos de código" de javascript en mysql:

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

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

funció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'");
}
?>
BX16Soupapes
fuente