110

フォームフィールドのコンテンツをAJAX経由でPHPスクリプトにPOSTし、JavaScriptを使用してescape(field_contents)。問題は、プラス記号が削除されてスペースに置き換えられていることです。プラス記号を安全に「エンコード」してから、PHP側で適切に「デコード」するにはどうすればよいですか?

4

6 に答える 6

171

JSおよびPHPで使用するencodeURIComponent()と、正しい値を受け取るはずです。

注:にアクセスするとき$_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リクエストのみです。

URI. $_SERVER['REQUEST_URI']GETリクエストの場合、またはからこれを取得できます$_SERVER['QUERY_STRING']。urlencoded POSTの場合、file_get_contents('php://stdin')

注意:

decode()シングルバイトでエンコードされた文字に対してのみ機能します。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はエンコーディングをマングルします。

于 2009-09-03T16:20:25.210 に答える
22

JavaScriptで試してみてください:

encodeURIComponent() 

およびPHPの場合:

urldecode($_POST['field']);
于 2009-09-03T13:30:12.250 に答える
5

探している16進値は%2B

PHPで自動的に取得するには、文字列を実行しますurlencode($stringVal)。そして、それを元に戻すurldecode($stringVal)ためにそれを実行します。

JavaScriptで処理する場合は、escape( str )

編集

@bobinceのコメントの後、私はもっと読んだのですが、彼は正しいです。とを使用encodeURIComponent(str)decodeURIComponent(str)ます。\Escapeは文字を変換せず、 'sでのみエスケープします

于 2009-09-03T13:31:19.210 に答える
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])

この投稿に感謝します!

于 2015-03-06T22:18:05.347 に答える
0

phpでカールを実行する必要がある場合はurlencode()、PHPから使用する必要がありますが、個別に使用する必要があります。

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

そうした場合urlencode(strPOST)、別の問題が発生します。Item1が1つあり、&は%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は、curlでPOST用の文字列を準備するための良い方法です。

例2は、受容体が両方の値を区別するために等しいアンパサンドを認識しないことを示しています。

于 2012-04-23T05:52:19.787 に答える
-1

私の問題は、JavaScriptの「コード例」をmysqlに保存しようとしたときのアクセント(áÉñ)とプラス記号(+)にありました。

私の解決策(より良い方法ではありませんが、それは機能します):

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

保存する関数:

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'");
}
?>
于 2015-01-22T20:41:55.553 に答える