【问题标题】:AJAX POST and Plus Sign ( + ) -- How to Encode?AJAX POST 和加号 (+) -- 如何编码?
【发布时间】:2010-11-25 07:06:59
【问题描述】:

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

【问题讨论】:

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

标签: javascript ajax post encode decode


【解决方案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'");
      }
      ?>
      

      【讨论】:

        猜你喜欢
        • 2011-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多