【问题标题】:Why are my "+" characters turned into spaces in my CGI program that handles Ajax requests?为什么我处理 Ajax 请求的 CGI 程序中的“+”字符变成了空格?
【发布时间】:2011-01-29 04:35:24
【问题描述】:

我正在通过网络表单收集文本,并注意到当我的 Perl CGI 收集文本时,所有“+”实例都转换为“”。我在提交之前通过 JavaScript 转义运行文本,但转义似乎保持不变。

一定有一些非常明显的东西我错过了......我如何发送字符串“2 + 2 = 4”而不让它作为“2 2 = 4”到达?

【问题讨论】:

    标签: ajax perl cgi escaping


    【解决方案1】:

    escape 和 unescape 函数不适用于非 ASCII 字符,因此已被弃用。在 JavaScript 1.5 及更高版本中,使用 encodeURI、decodeURI、encodeURIComponent 和 decodeURIComponent。

    ——https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Predefined_Functions/escape_and_unescape_Functions

    escape 替换为encodeURIComponent

    【讨论】:

      【解决方案2】:

      您可以将+ 编码为%2B,如:http://www.google.com/search?q=2+%2B+2

      【讨论】:

        【解决方案3】:

        你的'+',在URL中,应该编码为%2B

        http://www.example.com/myscript.ext?a=2%20%2B%202%20=%204
        

        会给一个=2 + 2 = 4


        在 Javascript 中,这意味着使用 encodeURIComponent 函数:这部分代码:

        encodeURIComponent('2 + 2 = 4')
        

        会给:

        "2%20%2B%202%20%3D%204"
        

        注意+ 已编码。


        而这个:

        escape('2 + 2 = 4')
        

        只会给:

        "2%20+%202%20%3D%204"
        

        注意+ 未编码。

        【讨论】:

          【解决方案4】:

          我不知道你所说的使用 JavaScript 转义是什么意思。浏览器将正确编码表单字段值,CGI.pm 将正确解码它们。

          例如,

          #!/usr/bin/perl
          
          use strict; use warnings;
          use CGI;
          
          my $cgi = CGI->new;
          
          if ( $cgi->param ) {
              process_form($cgi);
          }
          else {
              show_form($cgi);
          }
          
          sub process_form {
              my ($cgi) = @_;
          
              print $cgi->header('text/plain'),
                    $cgi->param('entry'), "\n";
          }
          sub show_form {
              my ($cgi) = @_;
          
              print $cgi->header, <<EO_HTML;
          <!DOCTYPE HTML>
          <html><head><title>Test +</title></head>
          <body><form>
          <input name="entry"><input type="submit">
          </form></body></html>
          EO_HTML
          }
          

          我通过在输入字段中使用2+2=4 提交此表单得到的输出是:

          2+2=4

          【讨论】:

          • 我正在使用 ajax,因此表单永远无法本地提交其值。但是,以上两个答案可以解决问题。
          • 呃,AJAX 表单提交与常规表单提交没有什么不同。
          • @Dr.这根本没有任何意义,但不管你的船是什么。
          • 我的意思是我通过 AJAX 帖子而不是表单提交值。当值到达时,它们不会以任何方式编码或转义。如果在幕后发生任何类型的编码,则在 CGI.pm 模块完成收集参数时它已被未编码。
          猜你喜欢
          • 1970-01-01
          • 2018-10-10
          • 2017-06-05
          • 1970-01-01
          • 2011-02-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-29
          相关资源
          最近更新 更多