web-dev-qa-db-ja.com

AJAX POST and Plus Sign(+)-エンコード方法?

AJAX to a PHP script and via JavaScript to escape(field_contents)。]を使用してフォームフィールドの内容をPOSTします。問題はどのようにプラス記号を安全に「エンコード」してから、PHP側で適切に「デコード」できますか?

89
jalperin

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']_から取得できます。 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はエンコーディングを破壊します。

136
bucabay

JavaScriptで試してください:

encodeURIComponent() 

およびPHPの場合:

urldecode($_POST['field']);
17
Deniss Kozlovs

それをより面白くし、できれば他の人の髪の毛を引っ張らないようにすること。 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])

この投稿に感謝します!

4
Pawr

探している16進値は_%2B_です

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

JavaScriptで処理する場合は、escape( str )を使用します

編集

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

4
Rob Allen

Phpでcurlを実行する必要がある場合は、urlencode() from PHPしかし個別に!

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

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

例2は、両方の値を区別するために、レセプタが等しいとアンパサンドを表示しないことを示しています!

0
Marc