2009-09-03 15 views
76

मैं AJAX के माध्यम से एक PHP स्क्रिप्ट के लिए एक फॉर्म फ़ील्ड की सामग्री पोस्ट कर रहा हूं और जावास्क्रिप्ट का उपयोग escape(field_contents) पर कर रहा हूं। समस्या यह है कि किसी भी प्लस संकेतों को अलग किया जा रहा है और रिक्त स्थान से प्रतिस्थापित किया जा रहा है। मैं प्लस साइन को सुरक्षित रूप से 'एन्कोड' कैसे कर सकता हूं और उसके बाद PHP पक्ष पर उचित रूप से 'डीकोड' कर सकता हूं?AJAX पोस्ट और प्लस साइन (+) - एन्कोड कैसे करें?

+0

स्पष्टीकरण के लिए, मैं भागने (field_contents) का उपयोग कर रहा था, – jalperin

उत्तर

113

जेएस और PHP में encodeURIComponent() का उपयोग करें, आपको सही मान प्राप्त करना चाहिए।

नोट: यदि आप PHP में $_GET, $_POST या $_REQUEST पहुंचते हैं, तो आप मान जो पहले से ही डीकोड किया गया है पुन: प्राप्त करने कर रहे हैं।

उदाहरण:

अपने जे एस में:

// 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 अनुरोध है।

एक जीईटी अनुरोध के लिए आप इसे URI. $_SERVER['REQUEST_URI'] या $_SERVER['QUERY_STRING'] से पुनर्प्राप्त कर सकते हैं। एक urlencoded पद के लिए, file_get_contents('php://stdin')

एनबी:

decode() केवल एक बाइट एन्कोड किए गए वर्ण के लिए काम करता है। यह पूर्ण यूटीएफ -8 रेंज के लिए काम नहीं करेगा।

जैसे:

text = "\u0100"; // Ā 
// incorrect 
escape(text); // %u0100 
// correct 
encodeURIComponent(text); // "%C4%80" 

नोट: escape('\xc4\x80')

कौन सा बाइट क्रम (\xc4\x80) कि UTF-8 में एक का प्रतिनिधित्व करता है: "%C4%80" के बराबर है। तो यदि आप encodeURIComponent() का उपयोग करते हैं तो आपके सर्वर पक्ष को यह पता होना चाहिए कि यह यूटीएफ -8 प्राप्त कर रहा है। अन्यथा PHP एन्कोडिंग को उलझाएगा।

+0

एक फॉलो-अप: जब मैं एन्कोडुरिकोम्पोनेंट (टेक्स्ट) और टेक्स्ट में स्मार्ट कोट (&rsqo;) जैसे वर्ण शामिल होते हैं, तो PHP स्क्रिप्ट को जंक वर्ण दिखाई देते हैं। मुझे लगता है कि यह एक वर्णमाला समस्या है, लेकिन मुझे नहीं पता कि इसे कैसे हल किया जाए। मैं "सामग्री-प्रकार" के साथ AJAX पोस्ट कर रहा हूं: "एप्लिकेशन/एक्स-www-form-urlencoded; charset = UTF-8", और मैं सर्वर पक्ष पर PHP5 का उपयोग कर रहा हूं। – jalperin

+0

आप इन पात्रों को कैसे देख रहे हैं? आपको यह सुनिश्चित करना होगा कि ब्राउजर जानता है कि यह यूटीएफ -8 है। एचटीएमएल में आप '<मेटा http-equiv =" सामग्री-प्रकार "सामग्री =" टेक्स्ट/एचटीएमएल; वर्णसेट = यूटीएफ -8 ">' या 'मेटा वर्णसेट =" यूटीएफ -8 "> 'सेट कर सकते हैं' आप इसे भी सेट कर सकते हैं सामग्री में प्रकार HTTP शीर्षलेख के साथ PHP में।'हेडर (' सामग्री-प्रकार: टेक्स्ट/एचटीएमएल; वर्णसेट = यूटीएफ -8 '); 'पीएस: &rsqo; ब्राउज़र में डीकोड नहीं करता है (एफएफ 3.5)। – bucabay

+1

मैं तुमसे प्यार करता हूँ !!! तुम हमेशा मेरी मदद करो !! :) – Alejandra

15

जावास्क्रिप्ट में प्रयास करें:

encodeURIComponent() 

और PHP में:

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

एन्कोडरिकॉम्पोनेंट एन्कोड नहीं किया गया सही जवाब है - लेकिन चूंकि यह यूआरएल एन्कोडेड डेटा उत्पन्न करता है और एचटीएमएल एन्कोडेड डेटा नहीं, html_entity_encode रास्ता बंद है। – Quentin

5

हेक्साडेसिमल मान आप देख रहे हैं %2B

यह PHP में स्वचालित रूप से मिलता urlencode($stringVal) के माध्यम से अपने स्ट्रिंग को चलाने के लिए है । और उसके बाद इसे वापस पाने के लिए इसे urldecode($stringVal) चलाएं।

आप जावास्क्रिप्ट इसे संभाल चाहते हैं, @ bobince की टिप्पणी मैं और अधिक पढ़ने किया था के बाद

का उपयोग escape(str)

संपादित करें और वह सही है। encodeURIComponent(str) और decodeURIComponent(str) का उपयोग करें। एस्केप पात्रों को परिवर्तित नहीं करेगा, केवल उन्हें \ के

+1

* जावास्क्रिप्ट में 'बचें' (या 'unescape') का उपयोग न करें; वे यूआरएल-एन्कोडिंग के समान नहीं हैं और + और किसी भी गैर-ASCII यूनिकोड वर्णों के लिए गलत हो जाएंगे। encodeURIComponent/decodeURIComponent लगभग हमेशा वही है जो आप चाहते हैं। – bobince

1

यदि आपको PHP में कर्ल करना है, तो आपको PHP से urlencode() का उपयोग करना चाहिए लेकिन व्यक्तिगत रूप से!

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

आप urlencode(strPOST) करते हैं, तो आप आप एक और समस्या लाएगा, तो आप एक आइटम 1 और & होगा परिवर्तन% 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 कर्ल

उदाहरण 2 शो में पोस्ट के लिए स्ट्रिंग तैयार करने के लिए है कि रिसेप्टर बराबर नहीं देख सकेंगे अच्छा तरीका है और दोनों मूल्यों को अलग करने के लिए एम्परसैंड!

0

मेरी समस्या लहजे (á É एन) और धन चिह्न (+) जब मैं mysql के लिए जावास्क्रिप्ट "कोड उदाहरण" को बचाने की कोशिश करने के लिए के साथ था:

मेरी समाधान (नहीं बेहतर तरीका है, लेकिन यह काम करता है):

जावास्क्रिप्ट:

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 में nction:

<?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

इसे और अधिक रोचक बनाने और आशा है कि किसी और के लिए कम बाल खींचने में सक्षम हो। पाइथन का उपयोग करके, किसी डिवाइस के लिए निर्मित शब्दकोश जिसे हम कॉन्फ़िगर करने के लिए कर्ल का उपयोग कर सकते हैं।

समस्या: {"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]) 

इस पोस्ट के लिए धन्यवाद!

संबंधित मुद्दे