POST AJAX e sinal de adição (+) - como codificar?

98

Estou postando o conteúdo de um campo de formulário via AJAX para um script PHP e usando JavaScript para escape(field_contents). O problema é que todos os sinais de mais estão sendo eliminados e substituídos por espaços. Como posso 'codificar' com segurança o sinal de mais e, em seguida, 'decodificá-lo' apropriadamente no lado do PHP?

jalperin
fonte
para esclarecer, eu estava usando escape (field_contents), não encode
jalperin

Respostas:

156

Use encodeURIComponent()em JS e em PHP você deve receber os valores corretos.

Nota: Ao acessar $_GET, $_POSTou $_REQUESTem PHP, você está recuperando valores que já foram decodificados.

Exemplo:

Em seu 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

No seu servidor:

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

É apenas a solicitação HTTP bruta que contém os dados codificados de url.

Para uma solicitação GET, você pode recuperá-la de URI. $_SERVER['REQUEST_URI']ou $_SERVER['QUERY_STRING']. Para um POST codificado por url,file_get_contents('php://stdin')

NB:

decode()só funciona para caracteres codificados de byte único. Não funcionará com a faixa UTF-8 completa.

por exemplo:

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

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

Qual é a sequência de bytes ( \xc4\x80) que representa Āem UTF-8. Portanto, se você usar encodeURIComponent()seu servidor deve saber que ele está recebendo UTF-8. Caso contrário, o PHP irá destruir a codificação.

Bucabay
fonte
Um acompanhamento: quando codificoURIComponent (texto) e o texto inclui caracteres como as aspas inteligentes (& rsqo;), o script php parece ver caracteres inúteis. Presumo que seja um problema de charset, mas não sei como resolvê-lo. Estou fazendo o AJAX POST com "Content-Type": "application / x-www-form-urlencoded; charset = UTF-8" e estou usando PHP5 no lado do servidor.
jalperin,
Como você está vendo esses personagens? Você precisa ter certeza de que o navegador sabe que é UTF-8. Em HTML, você pode definir <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">ou <meta charset="UTF-8">também em PHP com o cabeçalho HTTP Content-Type. header('Content-Type: text/html;charset=UTF-8');PS: & rsqo; não decodifica no navegador (FF3.5).
bucabay,
5
Tive um problema com o caractere mais (+) mudando para o espaço. Todo o resto correu bem em UTF8. Tive boa sorte usando com encodeURIComponent (JSON.stringify (rootObject)). Obrigado!
zneo de
Ao encontrar esse problema com as senhas (que foram coletadas por meio de um post de formulário javascript), resolvi com password = encodeURIComponent (senha). Quando passado para o PHP, o valor POST codificado da senha funciona corretamente.
lowcrawler
19

Em JavaScript, tente:

encodeURIComponent() 

e em PHP:

urldecode($_POST['field']);
Deniss Kozlovs
fonte
7
encodeURIComponent é a resposta certa - mas como ele gera dados codificados por URL e não dados codificados por HTML, html_entity_encode está errado.
Quentin,
1
urldecodetambém está errado, pois o PHP irá decodificá-lo automaticamente antes de preencher $_POST.
Quentin
5

O valor hexadecimal que você está procurando é %2B

Para obtê-lo automaticamente no PHP, execute sua string urlencode($stringVal). E então execute-o urldecode($stringVal)para recuperá-lo.

Se você quiser que o JavaScript trate disso, use escape( str )

Editar

Após o comentário de @bobince eu li mais e ele está correto. Use encodeURIComponent(str)e decodeURIComponent(str). Escape não converterá os caracteres, apenas os escape com \'s

Rob Allen
fonte
1
Não use escape(ou unescape) em JavaScript; eles não são iguais à codificação de URL e serão incorretos para + e quaisquer caracteres Unicode não ASCII. encodeURIComponent / decodeURIComponent é quase sempre o que você deseja.
bobince,
4

Para torná-lo mais interessante e, com sorte, permitir menos puxões de cabelo para outra pessoa. Usando python, um dicionário construído para um dispositivo que podemos usar curl para configurar.

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

Solução: {"timezone":"%2B"+"5"} //Works

Então, em poucas palavras:

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

Graças a este post!

Pawr
fonte
0

Se você tiver que fazer um curl em php, deve usar urlencode()do PHP, mas individualmente!

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

Se fizer isso urlencode(strPOST), você trará outro problema, você terá um item1 e & será alterado do valor% xx e será como um valor, veja aqui embaixo o retorno!

Exemplo 1

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

Exemplo 2

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

O Exemplo 1 é uma boa maneira de preparar a string para POST em curl

O Exemplo 2 mostra que o receptor não verá o igual e o E comercial para distinguir os dois valores!

Marc
fonte
-1

meu problema era com os acentos (á É ñ) e o sinal de mais (+) quando tento salvar "exemplos de código" javascript no mysql:

minha solução (não da melhor forma, mas 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;
}

função para salvar:

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

função em 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'");
}
?>
BX16Supapes
fonte