AJAX POST এবং Plus Sign (+) - কীভাবে এনকোড করবেন?


100

আমি AJAX এর মাধ্যমে একটি পিএইচপি স্ক্রিপ্টে ফর্ম ক্ষেত্রের বিষয়বস্তু পোস্ট করছি এবং জাভাস্ক্রিপ্ট ব্যবহার করছি escape(field_contents)। সমস্যাটি হ'ল যে কোনও প্লাস লক্ষণগুলি ফাঁকা করে প্রতিস্থাপন করা হচ্ছে। আমি কীভাবে প্লাস সাইনটি নিরাপদে 'এনকোড' করব এবং তারপরে পিএইচপি পাশে যথাযথভাবে 'ডিকোড' করব?


স্পষ্ট করার জন্য, আমি পলায়ন (ফিল্ড_কন্টেন্টস) ব্যবহার করছিলাম, এনকোড নয়
জাল্পেরিন

উত্তর:


158

encodeURIComponent()জেএস এবং পিএইচপি ব্যবহার করুন আপনার সঠিক মান পাওয়া উচিত।

দ্রষ্টব্য: আপনি অ্যাক্সেস $_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']; // "+"

এটি কেবলমাত্র কাঁচা এইচটিটিপি অনুরোধে ইউআরএল এনকোডড ডেটা রয়েছে।

একটি জিইটি অনুরোধের জন্য আপনি এটি থেকে URI. $_SERVER['REQUEST_URI']বা এটি পুনরুদ্ধার করতে পারেন $_SERVER['QUERY_STRING']। একটি বিলিবিহীন পোষ্টের জন্য,file_get_contents('php://stdin')

এনবি:

decode()কেবলমাত্র একক বাইট এনকোড করা অক্ষরের জন্য কাজ করে। এটি সম্পূর্ণ ইউটিএফ -8 ব্যাপ্তির জন্য কাজ করবে না।

যেমন:

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

দ্রষ্টব্য: "%C4%80"এর সমতুল্য:escape('\xc4\x80')

কোনটি বাইট সিকোয়েন্স ( \xc4\x80) যা Āইউটিএফ -8 এ উপস্থাপন করে । সুতরাং আপনি যদি encodeURIComponent()নিজের সার্ভারটি ব্যবহার করেন তবে অবশ্যই এটি জেনে রাখা উচিত যে এটি ইউটিএফ -8 গ্রহণ করছে। অন্যথায় পিএইচপি এনকোডিংটি ম্যাঙ্গেল করবে।


একটি ফলোআপ: আমি যখন এনকোডিউরিওকোম্পোন্ট (পাঠ্য) এবং পাঠ্যটিতে স্মার্ট উদ্ধৃতি (& rsqo;) এর মতো অক্ষর অন্তর্ভুক্ত থাকে, তখন পিএইচপি স্ক্রিপ্টটি জাঙ্ক অক্ষরগুলি দেখে মনে হয়। আমি ধরে নিলাম এটি একটি চরসেটের সমস্যা, তবে কীভাবে এটি সমাধান করা যায় তা আমি জানি না। আমি "কন্টেন্ট-টাইপ": "অ্যাপ্লিকেশন / x-www-form-urlencoded; চরসেট = ইউটিএফ -8" দিয়ে এজেএক্স পোস্ট করছি এবং আমি সার্ভারের পাশে পিএইচপি 5 ব্যবহার করছি।
জাল্পেরিন

আপনি এই চরিত্রগুলি কীভাবে দেখছেন? আপনাকে এটি নিশ্চিত করতে হবে যে ব্রাউজারটি এটি ইউটিএফ -8 জানে। এইচটিএমএলে আপনি কনটেন্ট-টাইপ এইচটিটিপি শিরোনাম দিয়ে সেট করতে পারেন <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">বা <meta charset="UTF-8">এটি পিএইচপিতে সেট করতে পারেন। header('Content-Type: text/html;charset=UTF-8');পিএস: & আরএসকিও; ব্রাউজারে ডিকোড হয় না (FF3.5)।
বুকাবায়ে

4
প্লাস (+) চরিত্রটি মহাশূন্যে পরিবর্তিত হওয়ার সাথে আমার একটি সমস্যা হয়েছিল। ইউটিএফ 8-এ অন্য সব কিছু ঠিক আছে। এনকোডিউআরআইকিউম্পোন্ট (JSON.stringify (রুটবজেক্ট)) ব্যবহার করে আমার ভাগ্য ভাল। ধন্যবাদ!
zneo

পাসওয়ার্ডগুলি (যা একটি জাভাস্ক্রিপ্ট ফর্ম পোস্টের মাধ্যমে সংগ্রহ করা হয়েছিল) নিয়ে সমস্যাটি চালানোর সময় আমি এটি পাসওয়ার্ড = এনকোডেরিউআরকিউম্পোনেন্ট (পাসওয়ার্ড) দিয়ে সমাধান করেছি। পিএইচপি-তে পাস করার সময়, পাসওয়ার্ডের এনকোডড POST মানটি সঠিকভাবে কাজ করে।
লোয়ারক্রোলার

20

জাভাস্ক্রিপ্ট চেষ্টা করুন:

encodeURIComponent() 

এবং পিএইচপি তে:

urldecode($_POST['field']);

7
এনকোডিউআরআইকিউম্পোনেন্টটি সঠিক উত্তর - তবে এটি ইউআরএল এনকোডড ডেটা এবং HTML এনকোডড ডেটা উত্পন্ন না করায়, html_entity_encode বন্ধ en
কোয়ান্টিন

4
urldecodeএছাড়াও বন্ধ হিসাবে পিএইচপি এটা পূর্ণ আগে স্বয়ংক্রিয়ভাবে ডিকোড হবে উপায় $_POST
কোয়ান্টিন

5

আপনি যে হেক্সাডেসিমাল মানটি সন্ধান করছেন তা হ'ল %2B

এটি পিএইচপিতে স্বয়ংক্রিয়ভাবে পেতে আপনার স্ট্রিংটি চালান urlencode($stringVal)। এবং তারপরে urldecode($stringVal)এটি ফিরে পেতে এটিকে চালাও ।

আপনি যদি জাভাস্ক্রিপ্ট এটি পরিচালনা করতে চান তবে ব্যবহার করুন escape( str )

সম্পাদনা করুন

@ বোবিন্সের মন্তব্যের পরে আমি আরও বেশি পড়তে পেরেছিলাম এবং তিনি সঠিক। ব্যবহার করুন encodeURIComponent(str)এবং decodeURIComponent(str)। এস্কেপ অক্ষর রূপান্তরিত করবে না, কেবল তাদের \গুলি দিয়ে পালাতে হবে


4
জাভাস্ক্রিপ্টে escape(বা unescape) ব্যবহার করবেন না ; এগুলি ইউআরএল-এনকোডিংয়ের মতো নয় এবং এটি + এবং কোনও- ASCII ইউনিকোড অক্ষরের জন্য ভুল হয়ে যাবে। এনকোডিউআরআইকিউম্পোনেন্ট / ডিকোডেরিউআরকিউম্পোনেন্ট আপনি যা চান তা প্রায় সর্বদা।
বোবিনস

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

আপনার যদি পিএইচপি তে কার্ল করতে 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 টি উদাহরণটি curl এ POST এর জন্য স্ট্রিং প্রস্তুত করার ভাল উপায়

উদাহরণ 2 দেখায় যে রিসেপ্টর উভয় মানের পার্থক্য করতে সমান এবং অ্যাম্পারস্যান্ড দেখতে পাবে না!


-1

আমি যখন জাভাস্ক্রিপ্ট "কোড উদাহরণ" মাইএসকিএলে সংরক্ষণ করার চেষ্টা করব তখন আমার সমস্যাটি ছিল অ্যাকসেন্ট (á É ñ) এবং প্লাস চিহ্ন (+) নিয়ে:

আমার সমাধান (এর চেয়ে ভাল উপায় নয়, তবে এটি কাজ করে):

জাভাস্ক্রিপ্ট:

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
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'");
}
?>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.