为什么我的“+”字符在我的CGI程序中变成了处理Ajax请求的空格?

时间:2010-03-18 19:35:09

标签: ajax perl cgi escaping

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

我必须有一些非常明显的东西......我如何发送字符串“2 + 2 = 4”而没有以“2 2 = 4”的形式到达?

4 个答案:

答案 0 :(得分:4)

  

对于非ASCII字符,escape和unescape函数无法正常工作,并且已弃用。在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

答案 1 :(得分:3)

您在网址中的+'应编码为%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"

请注意+未编码。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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