AJAX POST 和加号 (+) -- 如何编码?
Posted
技术标签:
【中文标题】AJAX POST 和加号 (+) -- 如何编码?【英文标题】:AJAX POST and Plus Sign ( + ) -- How to Encode? 【发布时间】:2010-11-25 07:06:59 【问题描述】:我通过 AJAX 将表单字段的内容发布到 php 脚本,并使用 javascript 到 escape(field_contents)
。问题是任何加号都被删除并被空格替换。如何安全地“编码”加号,然后在 PHP 端适当地“解码”它?
【问题讨论】:
澄清一下,我使用的是 escape(field_contents),而不是编码 【参考方案1】:在 JS 和 PHP 中使用 encodeURIComponent()
您应该会收到正确的值。
注意:当您在 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 会破坏编码。
【讨论】:
一个后续:当我 encodeURIComponent(text) 并且 text 包含像智能引号 (&rsqo;) 这样的字符时,php 脚本似乎看到了垃圾字符。我认为这是一个字符集问题,但我不知道如何解决它。我正在使用“Content-Type”进行 AJAX POST:“application/x-www-form-urlencoded; charset=UTF-8”,并且我在服务器端使用 PHP5。 您如何看待这些角色?您必须确保浏览器知道它是 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)。
我遇到了将加号 (+) 字符更改为空格的问题。 UTF8 中的其他一切都很好。使用 encodeURIComponent(JSON.stringify(rootObject)) 时我很幸运。谢谢!
当遇到密码问题(通过 javascript 表单帖子收集)时,我使用密码 = encodeURIComponent(password) 解决了这个问题。当传递给 PHP 时,密码的编码 POST 值正确计算。【参考方案2】:
在 JavaScript 中尝试:
encodeURIComponent()
在 PHP 中:
urldecode($_POST['field']);
【讨论】:
encodeURIComponent 是正确的答案——但由于它生成的是 URL 编码数据而不是 HTML 编码数据,因此 html_entity_encode 很遥远。urldecode
也很遥远,因为 PHP 会在填充 $_POST
之前自动对其进行解码。【参考方案3】:
您要查找的十六进制值是%2B
要在 PHP 中自动获取它,请通过 urlencode($stringVal)
运行您的字符串。然后通过urldecode($stringVal)
运行它以取回它。
如果您希望 JavaScript 处理它,请使用 escape( str )
编辑
@bobince 发表评论后,我阅读了更多内容,他是正确的。
使用encodeURIComponent(str)
和decodeURIComponent(str)
。 Escape 不会转换字符,只能用\
's 转义它们
【讨论】:
不要在 JavaScript 中使用escape
(或unescape
);它们与 URL 编码不同,对于 + 和任何非 ASCII Unicode 字符都会出错。 encodeURIComponent/decodeURIComponent 几乎总是你想要的。【参考方案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])
感谢这篇文章!
【讨论】:
【参考方案5】:如果你必须在 php 中进行 curl,你应该使用 PHP 中的 urlencode()
,但要单独使用!
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 表明受体不会看到相等和 & 来区分这两个值!
【讨论】:
【参考方案6】:当我尝试将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'");
?>
【讨论】:
以上是关于AJAX POST 和加号 (+) -- 如何编码?的主要内容,如果未能解决你的问题,请参考以下文章