110

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

4

6 回答 6

171

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

注意:当您访问或在 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']; // "+"

只有原始 HTTP 请求包含 url 编码数据。

对于 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 会破坏编码。

于 2009-09-03T16:20:25.210 回答
22

在 JavaScript 中尝试:

encodeURIComponent() 

在 PHP 中:

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

您正在寻找的十六进制值是%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 中进行 curl,你应该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 表明受体不会看到相等和 & 来区分这两个值!

于 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 回答