javascript - AJAX POST和加号(+) - 如何编码?

我正在通过AJAX将表单字段的内容发布到PHP脚本并使用JavaScript到escape(field_contents).问题是任何加号都被剥离并被空格替换。 如何安全地'编码'加号然后在PHP端适当地“解码”它?

jalperin asked 2019-09-10T20:08:27Z
6个解决方案
131 votes

在JS和PHP中使用\xc4\x80,您应该收到正确的值。

注意:当您在PHP中访问\xc4\x80,ĀencodeURIComponent()时,您正在检索已经解码的值。

例:

在你的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请求,您可以从\xc4\x80Ā中检索此信息。对于urlencoded POST,encodeURIComponent()

注意:

\xc4\x80仅适用于单字节编码字符。 它不适用于完整的UTF-8系列。

例如:

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

注:\xc4\x80相当于:Ā

这是以UTF-8表示Ā的字节序列(\xc4\x80)。 因此,如果您使用encodeURIComponent(),您的服务器端必须知道它正在接收UTF-8。 否则PHP将破坏编码。

bucabay answered 2019-09-10T20:09:44Z
17 votes

在JavaScript中尝试:

encodeURIComponent() 

在PHP中:

urldecode($_POST['field']);
Deniss Kozlovs answered 2019-09-10T20:10:15Z
4 votes

您要查找的十六进制值是encodeURIComponent(str)

要在PHP中自动获取它,请通过encodeURIComponent(str)运行您的字符串。然后运行它以使用decodeURIComponent(str)将其恢复。

如果您希望JavaScript处理它,请使用encodeURIComponent(str)

编辑

在@ bobince的评论之后,我做了更多的阅读,他是正确的。使用encodeURIComponent(str)decodeURIComponent(str).转义不会转换字符,只能用\转义它们

Rob Allen answered 2019-09-10T20:11:03Z
4 votes

为了使它更有趣,并希望减少其他人的头发拉动。使用python,为我们可以使用curl配置的设备构建字典。

问题:{"timezone":"%2B"+"5"} //Works

解决方案:{"timezone":"%2B"+"5"} //Works

所以,简而言之:

var = {"timezone":"%2B"+"5"}
json = JSONEncoder().encode(var)
subprocess.call(["curl",ipaddress,"-XPUT","-d","data="+json])

感谢这篇文章!

Pawr answered 2019-09-10T20:11:54Z
0 votes

如果你必须在PHP中做一个卷曲,你应该使用PHP的urlencode(strPOST)但单独!

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表明,受体不会看到相等的和&符号来区分这两个值!

Marc answered 2019-09-10T20:12:43Z
-1 votes

我的问题是重音符号(áÉñ)和加号(+)当我尝试将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'");
}
?>
BX16Soupapes answered 2019-09-10T20:13:34Z
translate from https://stackoverflow.com:/questions/1373414/ajax-post-and-plus-sign-how-to-encode