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


98

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


澄清一下,我使用的是escape(field_contents),而不是编码
jalperin

Answers:


156

encodeURIComponent()在JS和PHP中使用时,您应该收到正确的值。

注意:当您访问$_GET$_POST$_REQUEST在PHP中,要检索已经被解码值。

例:

在您的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']; // "+"

仅原始HTTP请求包含url编码的数据。

对于GET请求,您可以从URI. $_SERVER['REQUEST_URI']或中检索该请求$_SERVER['QUERY_STRING']。对于邮递区号,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将破坏编码。


后续措施:当我对URIComponent(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">也可以在PHP中使用Content-Type HTTP Header进行设置。header('Content-Type: text/html;charset=UTF-8');PS:&rsqo; 无法在浏览器中解码(FF3.5)。
bucabay

5
我在将加号(+)转换为空格时遇到问题。在UTF8中,其他一切都进行得很好。我很幸运与encodeURIComponent(JSON.stringify(rootObject))一起使用。谢谢!
zneo 2011年

当遇到密码问题(通过javascript表单帖子收集)时,我使用password = encodeURIComponent(password)解决了该问题。当传递给PHP时,密码的POST编码值可以正确计算出来。
lowcrawler 2015年

19

在JavaScript中尝试:

encodeURIComponent() 

在PHP中:

urldecode($_POST['field']);

7
encodeURIComponent是正确的答案,但是由于它生成的是URL编码的数据而不是HTML编码的数据,因此html_entity_encode很遥远。
昆汀2009年

1
urldecode由于PHP会在填充之前自动对其进行解码,因此也是遥遥无期的$_POST
昆汀

5

您正在寻找的十六进制值是 %2B

要在PHP中自动获取它,请通过运行字符串urlencode($stringVal)。然后粗暴urldecode($stringVal)地跑回去。

如果要让JavaScript处理,请使用 escape( str )

编辑

@bobince发表评论后,我做了更多阅读,他是正确的。使用encodeURIComponent(str)decodeURIComponent(str)。逃生不会转换角色,只有逃离他们\


1
不要在JavaScript中使用escape(或unescape);它们与URL编码不同,并且+和任何非ASCII Unicode字符都会出错。encodeURIComponent / decodeURIComponent几乎总是您想要的。
bobince

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

如果您必须在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

当我尝试将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'");
}
?>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.