我正在通过 AJAX 将表单字段的内容发布到 PHP 脚本并使用 JavaScript 到escape(field_contents)
. 问题是任何加号都被删除并被空格取代。如何安全地“编码”加号,然后在 PHP 端适当地“解码”它?
AJAX POST 和加号 (+)——如何编码?
使用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']
。对于 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 将破坏编码。
在 JavaScript 中尝试:
encodeURIComponent()
在 PHP 中:
urldecode($_POST['field']);
您正在寻找的十六进制值是 %2B
要在 PHP 中自动获取它,请通过urlencode($stringVal)
. 然后运行它urldecode($stringVal)
以将其恢复。
如果您希望 JavaScript 处理它,请使用 escape( str )
编辑
在@bobince 发表评论后,我阅读了更多内容,他是对的。使用encodeURIComponent(str)
和decodeURIComponent(str)
。Escape 不会转换字符,只用\
's转义它们
为了让它更有趣,并希望减少别人的头发拉扯。使用 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])
感谢这篇文章!
如果你必须在 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 表明接收器不会看到相等和与号来区分这两个值!