2009-09-03 4 views
76

양식 필드의 내용을 AJAX를 통해 PHP 스크립트에 게시하고 JavaScript를 escape(field_contents)에 게시하고 있습니다. 문제는 모든 더하기 기호가 제거되고 공백으로 대체된다는 것입니다. 어떻게하면 안전하게 + 부호를 인코딩 한 다음 PHP 측에서 적절하게 '디코딩'할 수 있습니까?AJAX POST 및 더하기 기호 (+) - 인코딩 방법?

+0

명확히하기 위해 나는 encode하지 않고 escape (field_contents)를 사용했습니다 – jalperin

답변

113

JS 및 PHP에서 encodeURIComponent()를 사용하면 올바른 값을 받아야합니다.

참고 : PHP에서 $_GET, $_POST 또는 $_REQUEST에 액세스하면 이미 디코딩 된 값을 검색하게됩니다.

예 : 당신의 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']; // "+" 

그것은 URL 인코딩 된 데이터를 포함에만 원시 HTTP 요청입니다.

GET 요청의 경우 URI. $_SERVER['REQUEST_URI'] 또는 $_SERVER['QUERY_STRING']에서 검색 할 수 있습니다. urlencode되고 POST를 들어, file_get_contents('php://stdin')

주의 :

decode()에만 단일 바이트 인코딩 된 문자를 사용할 수 있습니다. 전체 UTF-8 범위에서는 작동하지 않습니다.

예 :

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

참고 UTF-8에서를 나타내는 바이트 시퀀스 (\xc4\x80)이다 escape('\xc4\x80')

: "%C4%80"는 동일하다. 따라서 encodeURIComponent()를 사용하는 경우 서버 측에서 UTF-8을 수신하고 있음을 알아야합니다. 그렇지 않으면 PHP가 인코딩을 조작합니다.

+0

후속 조치 : encodeURIComponent (텍스트)와 텍스트에 스마트 따옴표 (&rsqo;)와 같은 문자가 포함 된 경우 PHP 스크립트에 정크 문자가있는 것 같습니다. 나는 그것이 charset 문제라고 생각하지만, 그것을 해결하는 방법을 모른다. "Content-Type": "application/x-www-form-urlencoded; charset = UTF-8"을 사용하여 AJAX POST를 수행하고 서버 측에서 PHP5를 사용하고 있습니다. – jalperin

+0

이 캐릭터를 어떻게보고 있습니까? 브라우저가 UTF-8인지 확인해야합니다. HTML에서는''또는'을 설정할 수 있습니다 PHP에서 Content-Type HTTP 헤더를 사용합니다.'헤더 ('Content-Type : text/html; charset = UTF-8');'PS : &rsqo;은 브라우저 (FF3.5)에서 디코딩되지 않습니다. – bucabay

+1

나는 너희들을 사랑한다! 너는 항상 나를 도와 줘 !! :) – Alejandra

15

자바 스크립트에서 시도 :

encodeURIComponent() 

및 PHP에서을 :

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

encodeURIComponent가 올바른 대답입니다.하지만 URL 인코딩 된 데이터와 HTML 인코딩 된 데이터는 생성되지 않으므로 html_entity_encode는 off입니다. – Quentin

5

당신이 찾고있는 16 진수 값은 %2B

가 자동으로 PHP에서 그것을 얻을 urlencode($stringVal)를 통해 문자열을 실행하는 것입니다 . 그리고 그것을 되 찾으려면 urldecode($stringVal)을 실행하십시오.

당신은 자바 스크립트를 처리하는 경우

는 @ bobince 좀 더 읽기 한의 코멘트 후 escape(str)

편집

를 사용하고 그는 올바른 것입니다. encodeURIComponent(str)decodeURIComponent(str)을 사용하십시오. 이스케이프는 문자를 변환하지 않고 \의 문자로 변환합니다.

+1

* JavaScript에서는'escape' (또는'unescape')을 사용하지 마십시오; 그들은 URL 인코딩과 같지 않으며 + 및 모든 ASCII가 아닌 유니 코드 문자에 대해 잘못 될 것입니다. encodeURIComponent/decodeURIComponent는 거의 항상 당신이 원하는 것입니다. – bobince

1

PHP에서 컬을해야하는 경우 PHP에서 개별적으로 urlencode()을 사용해야합니다. 당신이 urlencode(strPOST)을 할 경우

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

, 당신은 당신에게 또 다른 문제를 가져올 것이다, 당신은 변경 %의 XX 값을하고 하나 개의 값으로 될 것입니다 하나의 항목 1과 &이있을 것이다, 여기에 아래로 수익을 볼!

예 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 쇼 POST의 문자열을 준비하는 좋은 방법 앰퍼샌드와 두 값을 구별합니다!

0

내 문제는 악센트 (á É N)와 내가 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'"); 
} 
?> 
3

더 재미 있고 잘하면 다른 사람을 위해 당기는 머리카락을 가능하게하십시오. 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]) 

감사합니다!