【发布时间】:2011-01-29 04:35:24
【问题描述】:
我正在通过网络表单收集文本,并注意到当我的 Perl CGI 收集文本时,所有“+”实例都转换为“”。我在提交之前通过 JavaScript 转义运行文本,但转义似乎保持不变。
一定有一些非常明显的东西我错过了......我如何发送字符串“2 + 2 = 4”而不让它作为“2 2 = 4”到达?
【问题讨论】:
我正在通过网络表单收集文本,并注意到当我的 Perl CGI 收集文本时,所有“+”实例都转换为“”。我在提交之前通过 JavaScript 转义运行文本,但转义似乎保持不变。
一定有一些非常明显的东西我错过了......我如何发送字符串“2 + 2 = 4”而不让它作为“2 2 = 4”到达?
【问题讨论】:
escape 和 unescape 函数不适用于非 ASCII 字符,因此已被弃用。在 JavaScript 1.5 及更高版本中,使用 encodeURI、decodeURI、encodeURIComponent 和 decodeURIComponent。
将escape 替换为encodeURIComponent
【讨论】:
您可以将+ 编码为%2B,如:http://www.google.com/search?q=2+%2B+2
【讨论】:
你的'+',在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"
注意+ 未编码。
【讨论】:
我不知道你所说的使用 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
【讨论】: