AJAX POST та знак Plus (+) - Як кодувати?


98

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


Щоб уточнити, я використовував escape (field_contents), а не
кодував

Відповіді:


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, кодованого адресою,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 перекриє кодування.


Один подальший процес: Коли я кодуюURIComponent (текст) і текст включає такі символи, як розумна цитата (& rsqo;), сценарій php, здається, бачить непотрібні символи. Я припускаю, що це проблема із комірками, але я не знаю, як її вирішити. Я виконую пошту AJAX з "Content-Type": "application / x-www-form-urlencoded; charset = UTF-8", і я використовую PHP5 на стороні сервера.
jalperin

Як ви переглядаєте цих персонажів? Ви повинні переконатися, що браузер знає, що це UTF-8. У HTML ви можете встановити <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">або <meta charset="UTF-8">ви також можете встановити його в PHP за допомогою HTTP-заголовка вмісту. header('Content-Type: text/html;charset=UTF-8');PS: & rsqo; не розшифровується в браузері (FF3.5).
bucabay

5
У мене виникла проблема із зміною символу плюс (+) у простір. Все інше пішло нормально в UTF8. Мені пощастило використовувати з encodeURIComponent (JSON.stringify (rootObject)). Дякую!
zneo

Коли я стикався з цією проблемою з паролями (які були зібрані через повідомлення у формі JavaScript), я вирішив її з паролем = encodeURIComponent (пароль). При передачі на PHP закодоване значення пароля POST працює правильно.
lowcrawler

19

Спробуйте в JavaScript:

encodeURIComponent() 

і в PHP:

urldecode($_POST['field']);

7
encodeURIComponent - це правильна відповідь, але оскільки він генерує кодовані URL-адресою дані, а не кодовані HTML-дані, html_entity_encode - це вихід.
Квентін

1
urldecodeтакож вихідний, оскільки PHP буде декодувати його автоматично перед заповненням $_POST.
Квентін

5

Шістнадцяткове значення, яке ви шукаєте %2B

Щоб автоматично отримати його в PHP, запустіть рядок urlencode($stringVal). А потім запустіть це грубо, urldecode($stringVal)щоб повернути його.

Якщо ви хочете, щоб JavaScript обробляв його, використовуйте escape( str )

Редагувати

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


1
Не використовуйте escape(або unescape) в JavaScript; вони не є такими, як кодування URL-адрес, і помиляються для + та будь-яких символів Unicode, що не належить ASCII. encodeURIComponent / decodeURIComponent - це майже завжди те, що ви хочете.
bobince

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 у згортці

Приклад 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'");
}
?>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.