СООБЩЕНИЕ AJAX и знак плюс ( + ) — Как закодировать?
-
21-09-2019 - |
Вопрос
Я отправляю содержимое поля формы через AJAX в PHP-скрипт и использую JavaScript для escape(field_contents)
.Проблема в том, что любые знаки плюс удаляются и заменяются пробелами.Как я могу безопасно "закодировать" знак плюс, а затем соответствующим образом "декодировать" его на стороне PHP?
Решение
Использование 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']
.Для сообщения с URL-кодом, 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 исказит кодировку.
Другие советы
В JavaScript попробуйте:
encodeURIComponent()
и в PHP:
urldecode($_POST['field']);
Шестнадцатеричное значение, которое вы ищете, является %2B
Чтобы получить это автоматически в PHP, запустите свою строку через urlencode($stringVal)
.А затем запустите его rhough urldecode($stringVal)
чтобы вернуть это обратно.
Если вы хотите, чтобы JavaScript обработал это, используйте escape( str )
Редактировать
После комментария @bobince я еще раз прочитал, и он прав.Использование encodeURIComponent(str)
и decodeURIComponent(str)
.Escape не преобразует символы, только экранирует их с помощью \
's
Чтобы сделать это интереснее и, надеюсь, позволить меньше дергать за волосы кого-то другого.Используя 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])
Спасибо за этот пост!
Если вам нужно выполнить curl на 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 - это хороший способ подготовить строку для ПУБЛИКАЦИИ в curl
Пример 2 показывает, что рецептор не увидит значение equal и амперсанд, чтобы различить оба значения!
моя проблема была с ударениями (á É с) и знаком плюс (+), когда я пытался сохранить javascript "code examples" в 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'");
}
?>