2009-09-03 46 views
76

Tôi đang POST nội dung của trường biểu mẫu qua AJAX tới tập lệnh PHP và sử dụng JavaScript tới escape(field_contents). Vấn đề là bất kỳ dấu cộng nào đang bị tước bỏ và thay thế bằng dấu cách. Làm thế nào tôi có thể an toàn 'mã hóa' dấu cộng và sau đó một cách thích hợp 'giải mã' nó ở phía PHP?Dấu và Dấu cộng AJAX (+) - Cách mã hóa?

+0

để làm rõ, tôi đã sử dụng escape (field_contents), không mã hóa – jalperin

Trả lời

113

Sử dụng encodeURIComponent() trong JS và trong PHP bạn sẽ nhận được các giá trị chính xác.

Lưu ý: Khi bạn truy cập $_GET, $_POST hoặc $_REQUEST trong PHP, bạn đang truy xuất các giá trị đã được giải mã.

Ví dụ:

Trong JS của bạn:

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

Mở máy chủ của bạn:

echo $_GET['string']; // "+" 

Nó chỉ là yêu cầu HTTP liệu có chứa dữ liệu url mã hóa.

Để có yêu cầu GET, bạn có thể truy xuất yêu cầu này từ URI. $_SERVER['REQUEST_URI'] hoặc $_SERVER['QUERY_STRING']. Đối với một POST urlencoded, file_get_contents('php://stdin')

NB:

decode() chỉ hoạt động cho byte mã hóa đơn ký tự. Nó sẽ không hoạt động với toàn bộ phạm vi UTF-8.

ví dụ:

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

Lưu ý: "%C4%80" tương đương với: escape('\xc4\x80')

Đó là chuỗi byte (\xc4\x80) đại diện cho một trong UTF-8. Vì vậy, nếu bạn sử dụng encodeURIComponent() phía máy chủ của bạn phải biết rằng nó đang nhận UTF-8. Nếu không thì PHP sẽ xé mã hóa.

+0

Một lần theo dõi: Khi tôi mã hóa thành phần (văn bản) và văn bản bao gồm các ký tự như trích dẫn thông minh (&rsqo;), tập lệnh php có vẻ như thấy các ký tự rác. Tôi cho rằng đó là vấn đề bộ ký tự, nhưng tôi không biết cách giải quyết nó. Tôi đang thực hiện AJAX POST với "Content-Type": "application/x-www-form-urlencoded; charset = UTF-8" và tôi đang sử dụng PHP5 ở phía máy chủ. – jalperin

+0

Bạn đang xem các ký tự này như thế nào? Bạn phải đảm bảo rằng trình duyệt biết đó là UTF-8. Trong HTML, bạn có thể đặt '' hoặc '' bạn cũng có thể đặt bằng PHP với Tiêu đề HTTP kiểu nội dung.'header ('Content-Type: text/html; charset = UTF-8');' PS: &rsqo; không giải mã trong trình duyệt (FF3.5). – bucabay

+1

Tôi yêu các bạn !!! bạn luôn giúp tôi !! :) – Alejandra

15

Trong JavaScript thử:

encodeURIComponent() 

và trong PHP:

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

encodeURIComponent là câu trả lời đúng - nhưng vì nó tạo dữ liệu được mã hóa URL và không phải dữ liệu được mã hóa HTML, html_entity_encode bị tắt. – Quentin

5

Giá trị thập lục phân bạn đang tìm kiếm là %2B

Để có được nó tự động trong PHP chạy chuỗi của bạn thông qua urlencode($stringVal) . Và sau đó chạy nó rhough urldecode($stringVal) để làm cho nó trở lại.

Nếu bạn muốn các hoạt Javascript để xử lý nó, sử dụng escape(str)

Sửa

Sau @ bobince bình luận của tôi đã đọc nhiều và ông là đúng. Sử dụng encodeURIComponent(str)decodeURIComponent(str). Thoát sẽ không chuyển đổi các ký tự, chỉ thoát khỏi các ký tự đó bằng cách \ 's

+1

* Không * sử dụng 'escape' (hoặc' unescape') trong JavaScript; chúng không giống như mã hóa URL và sẽ sai đối với + và bất kỳ ký tự Unicode không phải ASCII nào. encodeURIComponent/decodeURIComponent hầu như luôn là thứ bạn muốn. – bobince

1

Nếu bạn phải thực hiện curl trong php, bạn nên sử dụng urlencode() từ PHP nhưng riêng lẻ!

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

Nếu bạn làm urlencode(strPOST), bạn sẽ mang lại cho bạn một vấn đề khác, bạn sẽ có một Item1 và & sẽ thay đổi% giá trị xx và như một giá trị, thấy xuống đây sự trở lại!

Ví dụ 1

$strPOST = "Item1=" . $Value1 . "&Item2=" . urlencode("+") will give Item1=Value1&Item2=%2B 

Ví dụ 2

$strPOST = urlencode("Item1=" . $Value1 . "&Item2=+") will give Item1%3DValue1%26Item2%3D%2B 

Ví dụ 1 là cách tốt để chuẩn bị chuỗi cho POST trong curl

Ví dụ 2 cho thấy các thụ thể sẽ không nhìn thấy bằng và dấu và để phân biệt cả hai giá trị!

0

vấn đề của tôi là với các điểm nhấn (á e n) và vào dấu cộng (+) khi tôi cố gắng để tiết kiệm javascript "ví dụ mã" để mysql:

giải pháp của tôi (không phải là cách tốt hơn, nhưng nó hoạt động):

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; 
} 

chức năng để tiết kiệm:

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 

fu nction trong 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

Để làm cho nó thú vị hơn và hy vọng sẽ giúp ít tóc hơn cho người khác. Sử dụng python, được xây dựng từ điển cho một thiết bị mà chúng ta có thể sử dụng curl để cấu hình.

Vấn đề: {"timezone":"+5"} //throws an error " 5"

Giải pháp: {"timezone":"%2B"+"5"} //Works

Vì vậy, trong một nutshell:

var = {"timezone":"%2B"+"5"} 
json = JSONEncoder().encode(var) 
subprocess.call(["curl",ipaddress,"-XPUT","-d","data="+json]) 

Nhờ bài này!

Các vấn đề liên quan