2009-09-03 7 views
76

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

+0

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

ответ

113

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

Примечание: Когда вы получаете доступ к , $_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')

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 будет искажать кодировку.

+0

One follow-up: Когда я кодируюURIComponent (текст) и текст включает символы, такие как смарт-цитата (&rsqo;), скрипт php, похоже, видит ненужные символы. Я предполагаю, что это проблема с кодировкой, но я не знаю, как ее разрешить. Я делаю AJAX POST с «Content-Type»: «application/x-www-form-urlencoded; charset = UTF-8», и я использую PHP5 на стороне сервера. – jalperin

+0

Как вы просматриваете эти персонажи? Вы должны убедиться, что браузер знает, что это UTF-8. В HTML вы можете установить '' или '' вы также можете установить его в PHP с HTTP-заголовком Content-Type.'header ('Content-Type: text/html; charset = UTF-8');' PS: &rsqo; не расшифровывается в браузере (FF3.5). – bucabay

+1

Я люблю тебя, ребята !!! вы всегда мне помогаете! :) – Alejandra

15

В JavaScript попробовать:

encodeURIComponent() 

и в PHP:

urldecode($_POST['field']); 
+7

encodeURIComponent - правильный ответ, но поскольку он генерирует URL-кодированные данные, а не кодированные HTML-данные, html_entity_encode выключен. – 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

1

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

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

Если вы urlencode(strPOST), принесет Вам еще одну проблему, вы будете иметь один ITEM1 и & будет изменить значение% хх и быть как одно значение, см здесь возвращение!

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

0

моя проблема была с акцентом (а Е п) и знак плюс (+), когда я, чтобы попытаться сохранить 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 

фу nct в 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'"); 
} 
?> 
3

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

Благодаря этой должности!

 Смежные вопросы

  • Нет связанных вопросов^_^