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

IT技术 javascript ajax post encode decode
2021-01-23 13:26:12

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

6个回答

使用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 将破坏编码。

我在将加号 (+) 字符更改为空格时遇到了问题。在 UTF8 中其他一切都很好。我很幸运使用 encodeURIComponent(JSON.stringify(rootObject))。谢谢!
2021-03-24 13:26:12
你如何看待这些角色?您必须确保浏览器知道它是 UTF-8。在 HTML 中,您可以设置<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta charset="UTF-8">也可以在 PHP 中使用 Content-Type HTTP 标头进行设置。header('Content-Type: text/html;charset=UTF-8');PS:&rsqo; 不在浏览器中解码 (FF3.5)。
2021-03-27 13:26:12
后续行动:当我 encodeURIComponent(text) 并且文本包含智能引号 (&rsqo;) 等字符时,php 脚本似乎看到垃圾字符。我认为这是一个字符集问题,但我不知道如何解决它。我正在使用 "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" 执行 AJAX POST,并且我在服务器端使用 PHP5。
2021-04-03 13:26:12
当遇到密码问题(通过 javascript 表单帖子收集)时,我用 password = encodeURIComponent(password) 解决了这个问题。当传递给 PHP 时,密码的编码 POST 值正确计算。
2021-04-06 13:26:12

在 JavaScript 中尝试:

encodeURIComponent() 

在 PHP 中:

urldecode($_POST['field']);
urldecode也很遥远,因为 PHP 会在填充之前自动解码它$_POST
2021-03-19 13:26:12
encodeURIComponent 是正确的答案——但由于它生成 URL 编码数据而不是 HTML 编码数据,因此 html_entity_encode 还差得远。
2021-04-03 13:26:12

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

要在 PHP 中自动获取它,请通过urlencode($stringVal). 然后运行它urldecode($stringVal)以将其恢复。

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

编辑

在@bobince 发表评论后,我阅读了更多内容,他是对的。使用encodeURIComponent(str)decodeURIComponent(str)Escape 不会转换字符,只用\'s转义它们

不要在 JavaScript 中使用escape(或unescape);它们与 URL 编码不同,对于 + 和任何非 ASCII Unicode 字符都会出错。encodeURIComponent/decodeURIComponent 几乎总是你想要的。
2021-04-09 13:26:12

为了让它更有趣,并希望减少别人的头发拉扯。使用 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 表明接收器不会看到相等和与号来区分这两个值!