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

98

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

ялперин
источник
чтобы уточнить, я использовал escape (field_contents), а не кодирование
jalperin 03

Ответы:

156

Используйте 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-запроса с URL-кодом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 будет искажать кодировку.

Bucabay
источник
Одно последующее действие: когда я кодируюURIComponent (текст) и текст включает символы, такие как умная цитата (& rsqo;), скрипт php, кажется, видит ненужные символы. Я предполагаю, что это проблема кодировки, но я не знаю, как ее решить. Я выполняю AJAX POST с «Content-Type»: «application / x-www-form-urlencoded; charset = UTF-8», и я использую PHP5 на стороне сервера.
jalperin 03
Как вы смотрите на этих персонажей? Вы должны убедиться, что браузер знает, что это UTF-8. В HTML вы можете установить <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">или <meta charset="UTF-8">вы также можете установить его в PHP с HTTP-заголовком Content-Type. header('Content-Type: text/html;charset=UTF-8');PS: & rsqo; не декодируется в браузере (FF3.5).
bucabay
5
У меня возникла проблема с заменой символа плюса (+) на пробел. Все остальное в UTF8 прошло нормально. Мне повезло с использованием encodeURIComponent (JSON.stringify (rootObject)). Спасибо!
zneo
Когда я столкнулся с этой проблемой с паролями (которые были собраны с помощью сообщения формы javascript), я решил ее с помощью password = encodeURIComponent (password). При передаче в PHP закодированное значение пароля POST работает правильно.
lowcrawler 01
19

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

encodeURIComponent() 

и в PHP:

urldecode($_POST['field']);
Денис Козлов
источник
7
encodeURIComponent - правильный ответ, но поскольку он генерирует данные в кодировке URL, а не данные в кодировке HTML, html_entity_encode не подходит.
Квентин
1
urldecodeтакже далеко, поскольку PHP будет декодировать его автоматически перед заполнением $_POST.
Quentin
5

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

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

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

редактировать

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

Роб Аллен
источник
1
Не используйте escape(или unescape) в JavaScript; они не совпадают с кодировкой URL и будут работать неправильно для + и любых символов Unicode, отличных от ASCII. encodeURIComponent / decodeURIComponent - это почти всегда то, что вам нужно.
bobince 03
4

Чтобы сделать его более интересным и, надеюсь, позволить кому-то меньше выдергивать волосы. Используя 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])

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

Паур
источник
0

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

Марк
источник
-1

моя проблема была с акцентами (á É ñ) и знаком плюс (+), когда я пытался сохранить "примеры кода" 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'");
}
?>
BX16Супапы
источник