我正在开发一个带有多种表单的Web应用程序,用户需要输入通常包含空格和/或加号的数据。
数据通常通过GET
个请求发送;或通过POST
Content-Type标头的application/x-www-form-urlencoded
次请求。
我尝试过使用Perl的Vars()
模块中的param
和CGI
,但这两种方法都坚持将+
符号转换为空格。
CGI
模块是否提供了保留+
标志的任何机制;或者我应该抛弃CGI
并手动解析STDIN
输入?
注意:
有了大量的表单(超过一百个),并且在集中式实用程序库中进行了CGI预处理,我完全偏向于服务器端解决方案而不是客户端方法(换句话说,我而不是在预处理代码上处理一次问题,而不是在数百个地方添加JS噪声。
提前感谢您提供的任何帮助。
示例:
根据评论中的要求,这里是一些触发问题的代码的(简化)示例。
HTML
<form action="/cgi-bin/some-script.pl">
<input name="some_field" value="1 + 1 is 2">
<input name="submit" type="submit" value="Submit">
</form>
的Perl
use CGI;
my $some_variable = CGI::param('some_field');
在提交具有默认值并运行服务器端代码的表单后,$some_variable
的值为"1 1 is 2"
(1之间有3个空格,SO网站或浏览器可能会将它们折叠到一个空间中); 期望的结果将在该变量中获得值"1 + 1 is 2"
。
答案 0 :(得分:7)
CGI参数中的加号表示空格。这是CGI规范。任何向您发送加号的HTTP客户端都意味着其他任何内容都会被破坏。任何处理加号的HTTP服务器都意味着其他任何东西都会被破坏。
所以问题不在你的CGI程序中(这是正确的)。问题出在HTTP客户端,它向您发送加号以使它们被解释为加号。在CGI程序中将加号作为参数发送的正确方法是将其编码为%2B。这是你需要解决的问题。
更新:我在Ubuntu上使用Apache运行了一个简单的测试。
我的HTML文件如下所示:
<html>
<head>
<title>Test</title>
</head>
<body>
<h1>Test</h1>
<form action="/cgi-bin/param">
<input name="some_field" value="1 + 1 is 2">
<input name="submit" type="submit" value="Submit">
</form>
</body>
</html>
我的Perl程序看起来像这样:
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use CGI qw[header param];
print header(-type => 'text/plain');
for (param) {
say "$_ -> ", join ':', param($_);
}
当我访问该页面并点击“提交”按钮时,浏览器转到了网址http://localhost/cgi-bin/param?some_field=1+%2B+1+is+2&submit=Submit
并显示以下内容:
some_field -> 1 + 1 is 2
submit -> Submit
这看起来像我期望看到的行为。浏览器将加号发送到浏览器时,正确地将加号编码为%2B。当我访问它时,Perl的CGI模块会解码该值。
您需要追踪您的浏览器(或您用来发送这些请求的其他任何客户端)未遵循CGI规范的原因。