AJAX POST और प्लस साइन (+) - कैसे एनकोड करें?


98

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


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

जवाबों:


156

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

नोट: जब आप एक्सेस करते हैं $_GET, $_POSTया $_REQUESTPHP में, आप उन मानों को पुनः प्राप्त कर रहे हैं जो पहले ही डिकोड हो चुके हैं।

उदाहरण:

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

// 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')

ध्यान दें:

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 एन्कोडिंग को नियंत्रित करेगा।


एक अनुवर्ती: जब मैं एन्कोडर्कोम्पोनेंट (पाठ) और पाठ में स्मार्ट उद्धरण (&ssqo;) जैसे वर्ण शामिल होते हैं, तो php स्क्रिप्ट कबाड़ वर्णों को देखती है। मुझे लगता है कि यह एक परेशान समस्या है, लेकिन मुझे नहीं पता कि इसे कैसे हल किया जाए। मैं "सामग्री-प्रकार" के साथ AJAX POST कर रहा हूं: "एप्लीकेशन / x-www-form-urlenc ब्लाक; चारसेट = UTF-8", और मैं सर्वर पर PHP5 का उपयोग कर रहा हूं।
जलपरिन

आप इन पात्रों को कैसे देख रहे हैं? आपको यह सुनिश्चित करना होगा कि ब्राउज़र जानता है कि यह UTF-8 है। HTML में आप सामग्री-प्रकार HTTP हेडर के साथ PHP में भी इसे सेट <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">या सेट <meta charset="UTF-8">कर सकते हैं। header('Content-Type: text/html;charset=UTF-8');पुनश्च: & rsqo; ब्राउज़र (FF3.5) में डिकोड नहीं होता है।
बुकाबे

5
मुझे प्लस (+) चरित्र के साथ अंतरिक्ष में बदलने की समस्या थी। UTF8 में बाकी सब ठीक रहा। मुझे encodeURIComponent (JSON.stringify (rootObject)) का उपयोग करने का सौभाग्य मिला। धन्यवाद!
zneo

जब पासवर्ड के साथ इस समस्या में चल रहा है (जो एक जावास्क्रिप्ट फॉर्म पोस्ट के माध्यम से एकत्र किया गया था) मैंने इसे पासवर्ड = encodeURIComponent (पासवर्ड) के साथ हल किया। जब PHP में पास किया जाता है, तो पासवर्ड का एन्कोडेड POST मान सही तरीके से काम करता है।
लोक्रेलर

19

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

encodeURIComponent() 

और PHP में:

urldecode($_POST['field']);

7
encodeURIComponent सही उत्तर है - लेकिन जैसा कि यह URL एन्कोडेड डेटा उत्पन्न करता है न कि HTML एन्कोडेड डेटा, HTML_entity_encode बंद है।
क्वेंटिन

1
urldecodeयह भी रास्ता है क्योंकि PHP आबादी से पहले स्वचालित रूप से इसे डिकोड करेगा $_POST
क्वेंटिन

5

आप जिस हेक्साडेसिमल मूल्य की तलाश कर रहे हैं %2B

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

यदि आप जावास्क्रिप्ट को संभालना चाहते हैं, तो उपयोग करें escape( str )

संपादित करें

@ Bobince की टिप्पणी के बाद मैंने और अधिक पठन किया और वह सही है। का उपयोग करें encodeURIComponent(str)और decodeURIComponent(str)। एस्केप वर्ण परिवर्तित नहीं होगा, केवल उन लोगों के साथ भागने \की


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

4

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

संकट: {"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), तो आप एक और समस्या लाएंगे, आपके पास एक आइटम 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 कर्ल में POST के लिए स्ट्रिंग तैयार करने का अच्छा तरीका है

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


-1

मेरी समस्या उच्चारणों (É and ñ) और प्लस चिन्ह (+) के साथ थी जब मैंने जावास्क्रिप्ट "कोड उदाहरण" को 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 में कार्य:

<?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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.