AJAX POSTとプラス記号(+)—エンコードする方法は?


98

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


明確にするために、私はエンコードではなく、escape(field_contents)を使用していました
jalperin

回答:


156

encodeURIComponent()JSと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']。URLエンコードされた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はエンコーディングを壊します。


1つのフォローアップ:encodeURIComponent(text)を使用していて、テキストにスマートクォート(&rsqo;)などの文字が含まれている場合、phpスクリプトでジャンク文字が表示されるようです。文字セットの問題だと思いますが、解決方法がわかりません。私は "Content-Type": "application / x-www-form-urlencoded; charset = UTF-8"でAJAX POSTを実行しており、サーバー側でPHP5を使用しています。
jalperin

これらのキャラクターをどのように見ていますか?ブラウザがUTF-8であることをブラウザが認識していることを確認する必要があります。HTMLでは、あなたが設定することができます<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta charset="UTF-8">、あなたはまた、コンテンツタイプHTTPヘッダーとPHPでそれを設定することができます。header('Content-Type: text/html;charset=UTF-8');PS:&rsqo; ブラウザではデコードしません(FF3.5)。
bucabay 2009

5
プラス(+)文字がスペースに変わる問題がありました。それ以外はすべてUTF8で問題なく動作しました。encodeURIComponent(JSON.stringify(rootObject))を使って幸運を祈りました。ありがとうございました!
zneo

パスワード(javascriptフォームの投稿を介して収集された)でこの問題が発生した場合、私はpassword = encodeURIComponent(password)で解決しました。PHPに渡されると、パスワードのエンコードされたPOST値が正しく機能します。
ロークローラー2015年

19

JavaScriptで試してください:

encodeURIComponent() 

そしてPHPでは:

urldecode($_POST['field']);

7
encodeURIComponentが正解です。ただし、URLエンコードされたデータを生成し、HTMLエンコードされたデータは生成しないため、html_entity_encodeは適切ではありません。
クエンティン

1
urldecodeまた、PHPはデータを入力する前に自動的にデコードするので、問題はありません$_POST
クエンティン

5

あなたが探している16進数の値は %2B

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

JavaScriptで処理したい場合は、 escape( str )

編集する

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


1
JavaScript ではescape(またはunescape)を使用しないでください。これらはURLエンコーディングと同じではなく、+や非ASCIIのUnicode文字では正しく機能しません。encodeURIComponent / decodeURIComponentはたいていの場合あなたが望むものです。
ボビンス2009

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])

この投稿に感謝します!


0

urlencode()PHPでカールする必要がある場合は、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は、curlでPOST用の文字列を準備する良い方法です

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


-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'");
}
?>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.