it-roy-ru.com

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

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

88
jalperin

Используйте 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']. Для POST с urlen-кодом, file_get_contents('php://stdin')

NB:

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 изменит кодировку.

134
bucabay

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

encodeURIComponent() 

и в PHP:

urldecode($_POST['field']);
17
Deniss Kozlovs

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

Проблема: {"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])

Спасибо за этот пост!

4
Pawr

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

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

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

Edit

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

4
Rob Allen

Если вам нужно свернуться в 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 показывает, что рецептор не увидит равных и амперсанд для различения обоих значений!

0
Marc