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?


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.


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']);

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


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!


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!


-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'");
}
?>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.