代码之家  ›  专栏  ›  技术社区  ›  Yevgeny Simkin

为什么在处理ajax请求的cgi程序中,“+”字符会变成空格?

  •  1
  • Yevgeny Simkin  · 技术社区  · 15 年前

    我正在通过web表单收集文本,并注意到当perl-cgi收集文本时,“+”的所有实例都将转换为。我在提交之前通过javascript转义运行文本,但是转义看起来没有改变。

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

    4 回复  |  直到 15 年前
        1
  •  4
  •   Quentin    15 年前

    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
  •  3
  •   Pascal MARTIN    15 年前

    + ,在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"
    

    注意 + 未编码。

        3
  •  1
  •   Callahad    15 年前

    你可以编码 + 作为 %2B ,如所示: http://www.google.com/search?q=2+%2B+2

        4
  •  1
  •   Sinan Ünür    15 年前

    我不知道您使用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