AJAX POST และเครื่องหมายบวก (+) - จะเข้ารหัสได้อย่างไร?


100

ผมโพสต์เนื้อหาของฟิลด์แบบฟอร์มผ่านทาง AJAX เพื่อสคริปต์ PHP และใช้งาน JavaScript escape(field_contents)เพื่อ ปัญหาคือเครื่องหมายบวกใด ๆ ถูกตัดออกและแทนที่ด้วยช่องว่าง ฉันจะ 'เข้ารหัส' เครื่องหมายบวกอย่างปลอดภัยแล้ว 'ถอดรหัส' ในฝั่ง PHP อย่างเหมาะสมได้อย่างไร


เพื่อชี้แจงฉันใช้ Escape (field_contents) ไม่ได้เข้ารหัส
jalperin

คำตอบ:


158

ใช้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']สำหรับ urlencoded POSTfile_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 จะรบกวนการเข้ารหัส


การติดตามผลหนึ่งครั้ง: เมื่อฉันเข้ารหัส UIComponent (text) และข้อความมีอักขระเช่น smart quote (& rsqo;) สคริปต์ php ดูเหมือนจะเห็นอักขระขยะ ฉันคิดว่ามันเป็นปัญหาของชุดอักขระ แต่ฉันไม่รู้วิธีแก้ไข ฉันกำลังทำ AJAX POST ด้วย "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 ด้วย Content-Type HTTP Header header('Content-Type: text/html;charset=UTF-8');ป.ล. : & rsqo; ไม่ถอดรหัสในเบราว์เซอร์ (FF3.5)
bucabay

5
ฉันมีปัญหากับอักขระบวก (+) ที่เปลี่ยนเป็นช่องว่าง ทุกอย่างเป็นไปด้วยดีใน ​​UTF8 ฉันโชคดีที่ใช้กับ encodeURIComponent (JSON.stringify (rootObject)) ขอบคุณ!
zneo

เมื่อพบปัญหานี้ด้วยรหัสผ่าน (ซึ่งรวบรวมผ่านโพสต์รูปแบบจาวาสคริปต์) ฉันแก้ไขด้วยรหัสผ่าน = เข้ารหัส URL ส่วนประกอบ (รหัสผ่าน) เมื่อส่งผ่านไปยัง PHP ค่า POST ที่เข้ารหัสของรหัสผ่านจะทำงานได้อย่างถูกต้อง
lowcrawler

20

ใน JavaScript ลอง:

encodeURIComponent() 

และใน PHP:

urldecode($_POST['field']);

7
encodeURIComponent เป็นคำตอบที่ถูกต้อง - แต่เนื่องจากสร้างข้อมูลที่เข้ารหัส URL ไม่ใช่ข้อมูลที่เข้ารหัส HTML html_entity_encode จึงเป็นทางออก
Quentin

1
urldecodeยังเป็นวิธีปิดเนื่องจาก PHP จะถอดรหัสโดยอัตโนมัติก่อนที่จะเติม$_POSTข้อมูล
Quentin

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

หากคุณต้องทำการ curl ใน 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 ใน curl

ตัวอย่างที่ 2 แสดงว่าตัวรับจะไม่เห็นค่าเท่ากันและแอมเพอร์แซนด์เพื่อแยกแยะค่าทั้งสอง!


-1

ปัญหาของฉันคือสำเนียง (áÉñ) และเครื่องหมายบวก (+) เมื่อฉันพยายามบันทึก javascript "ตัวอย่างโค้ด" ลงใน 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'");
}
?>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.