AJAX POST 및 더하기 기호 (+) — 인코딩하는 방법?


98

AJAX를 통해 PHP 스크립트에 양식 필드의 내용을 게시하고 JavaScript를 사용하여 escape(field_contents). 문제는 더하기 기호가 제거되고 공백으로 대체된다는 것입니다. 더하기 기호를 안전하게 '인코딩'한 다음 PHP 측에서 적절하게 '디코딩'하려면 어떻게해야합니까?


명확히하기 위해, 인코딩이 아닌 escape (field_contents)를 사용했습니다
jalperin

답변:


156

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

당신이 액세스 할 때 : 참고 $_GET, $_POST또는 $_REQUESTPHP에서, 당신은 이미 디코딩 된 값을 검색합니다.

예:

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']. urlencoded POST의 경우file_get_contents('php://stdin')

주의 :

decode()1 바이트 인코딩 문자에만 작동합니다. 전체 UTF-8 범위에서는 작동하지 않습니다.

예 :

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

참고 : 다음 "%C4%80"과 동일합니다.escape('\xc4\x80')

UTF-8로 \xc4\x80나타내는 바이트 시퀀스 ( )입니다 Ā. 따라서 encodeURIComponent()서버 측 을 사용하는 경우 UTF-8을 수신하고 있음을 알아야합니다. 그렇지 않으면 PHP가 인코딩을 망칠 것입니다.


후속 조치 : URIComponent (text)를 인코딩하고 텍스트에 스마트 따옴표 (& rsqo;)와 같은 문자가 포함되면 PHP 스크립트에 정크 문자가 표시되는 것 같습니다. 문자셋 문제라고 생각하지만 해결 방법을 모르겠습니다. "Content-Type": "application / x-www-form-urlencoded; charset = UTF-8"로 AJAX POST를 수행하고 있으며 서버 측에서 PHP5를 사용하고 있습니다.
jalperin

이 캐릭터들을 어떻게보고 계십니까? 브라우저가 UTF-8임을 인식하는지 확인해야합니다. HTML에서는 Content-Type 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).
bucabay

5
더하기 (+) 문자가 공백으로 바뀌는 데 문제가있었습니다. 다른 모든 것은 UTF8에서 잘되었습니다. encodeURIComponent (JSON.stringify (rootObject))와 함께 사용하는 행운이있었습니다. 감사합니다!
zneo

(자바 스크립트 양식 게시물을 통해 수집 된) 암호로이 문제가 발생할 때 password = encodeURIComponent (password)로 해결했습니다. PHP로 전달되면 암호의 인코딩 된 POST 값이 올바르게 작동합니다.
lowcrawler

19

JavaScript에서 다음을 시도하십시오.

encodeURIComponent() 

그리고 PHP에서 :

urldecode($_POST['field']);

7
encodeURIComponent가 정답입니다.하지만 HTML로 인코딩 된 데이터가 아닌 URL로 인코딩 된 데이터를 생성하기 때문에 html_entity_encode는 완전히 다릅니다.
Quentin

1
urldecodePHP가 채우기 전에 자동으로 디코딩하므로 $_POST.
Quentin

5

찾고있는 16 진수 값은 다음과 같습니다. %2B

PHP에서 자동으로 가져 오려면 urlencode($stringVal). 그런 다음 urldecode($stringVal)다시 가져 오기 위해 거칠게 실행하십시오 .

JavaScript가 처리하도록하려면 escape( str )

편집하다

@bobince의 코멘트 후에 나는 더 많은 것을 읽었고 그는 정확합니다. 사용 encodeURIComponent(str)하고 decodeURIComponent(str). Escape는 문자를 변환하지 않고 \'s 로만 이스케이프합니다.


1
JavaScript에서 escape(또는 unescape)을 사용 하지 마십시오 . URL 인코딩과 동일하지 않으며 + 및 비 ASCII 유니 코드 문자에 대해 잘못 될 것입니다. encodeURIComponent / decodeURIComponent는 거의 항상 원하는 것입니다.
bobince

4

더 흥미롭게 만들고 다른 사람을 위해 머리카락을 덜 당기기를 바랍니다. 파이썬을 사용하여 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

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은 curl에서 POST를위한 문자열을 준비하는 좋은 방법입니다.

예 2는 수용체가 두 값을 구별하기 위해 동등과 앰퍼샌드를 보지 않을 것임을 보여줍니다!


-1

내 문제는 내가 자바 스크립트 "코드 예제"를 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.