AJAX POST и знак плюса (+) - как кодировать?

Я отправляю содержимое поля формы через AJAX на PHP script и используя JavaScript для escape(field_contents). Проблема в том, что любые плюсовые знаки удаляются и заменяются пробелами. Как я могу безопасно "кодировать" знак "плюс", а затем "декодировать" его на стороне PHP?

Ответ 1

Использовать encodeURIComponent() в JS и PHP, вы должны получить правильные значения.

Примечание. Когда вы получаете доступ к $_GET, $_POST или $_REQUEST в PHP, вы получаете значения, которые уже были декодированы.

Пример:

В вашем 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

На вашем сервере:

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

Только необработанный HTTP-запрос содержит данные, закодированные в URL.

Для запроса GET вы можете получить это из URI. $_SERVER['REQUEST_URI'] или $_SERVER['QUERY_STRING']. Для urlencoded POST file_get_contents('php://stdin')

Примечание:

decode() работает только для символов с одним байтом. Он не будет работать для полного диапазона UTF-8.

например:

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

Примечание: "%C4%80" эквивалентно: escape('\xc4\x80')

Какая последовательность байтов (\xc4\x80), которая представляет À в UTF-8. Поэтому, если вы используете encodeURIComponent(), ваша сторона сервера должна знать, что она получает UTF-8. В противном случае PHP будет искажать кодировку.

Ответ 2

В JavaScript попробуйте:

encodeURIComponent() 

и в PHP:

urldecode($_POST['field']);

Ответ 3

Шестнадцатеричное значение, которое вы ищете, %2B

Чтобы получить его автоматически в PHP, запустите строку urlencode($stringVal). И затем запустите его rhough urldecode($stringVal), чтобы вернуть его.

Если вы хотите, чтобы JavaScript обрабатывал его, используйте escape( str )

Edit

После @bobince комментария я сделал больше чтения, и он прав. Используйте encodeURIComponent(str) и decodeURIComponent(str). Escape не будет преобразовывать символы, только избегать их с помощью \

Ответ 4

Чтобы сделать его более интересным и, надеюсь, позволить меньше волоса тянуть за кого-то другого. Использование python, встроенный словарь для устройства, для которого мы можем использовать завиток для настройки.

Проблема: {"timezone":"+5"} //throws an error " 5"

Решение: {"timezone":"%2B"+"5"} //Works

Итак, в двух словах:

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

Благодаря этому сообщению!

Ответ 5

Если вам нужно сделать завиток в php, вы должны использовать urlencode() из PHP, но индивидуально!

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

Если вы выполните urlencode(strPOST), вы столкнетесь с другой проблемой, у вас будет один Item1 и будет изменено значение% xx и будет как одно значение, см. здесь возвращение!

Пример 1

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

Пример 2

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

Пример 1 - хороший способ подготовить строку для POST в curl

Пример 2 показывает, что рецептор не будет видеть равные и амперсанд, чтобы отличить оба значения!

Ответ 6

моя проблема заключалась в акцентах (É ñ) и знаке плюса (+), когда я пытался сохранить javascript "примеры кода" в mysql:

мое решение (не лучший способ, но он работает):

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;
}

для сохранения:

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

в 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'");
}
?>