我使用$cgi->param('search_string');
在我的Perl脚本中检索url参数,但我怀疑$cgi->param
值在我得到之前通过uri_unescape()
函数传递。
示例:
search_string=ЛИКЕР ВИШНЕВЫЙ
search_string=%41B%418%41A%415%420+%412%418%428%41D%415%412%42B%419
$cgi->param('search_string')
返回ABA8AAA5B0+A2A8B8ADA5A2BBA9
而不是%41B%418%41A%415%420+%412%418%428%41D%415%412%42B%419
,我可以简单地解码。以下是我的代码中实际发生的事情:
我将此“ПЛЕНКАПИЩЕВАЯ”作为$ search_string传递;
$search_string =~ s/\s/+/g;
$search_string =~ s/\#/\%23/g;
$search_string =~ s/[^A-Za-z0-9\+\*\.\@\_\-]/uc sprintf("%%%02x",ord($&))/egx;
由此我在URL本身中得到search_string=%41F%41B%415%41D%41A%410+%41F%418%429%415%412%410%42F
。
然后,当我使用$cgi->param('search_string')
在另一端检索该值时,我得到了"AFABA5ADAAA0 AFA8B9A5A2A0BF"
。这里的另一个问题是,似乎$ cgi-> param('search_string')会自动调用uri_unescape(),这就是我得到"AFABA5ADAAA0 AFA8B9A5A2A0BF"
的原因。
如何制作,以便最终结果以"ПЛЕНКА ПИЩЕВАЯ"
的形式返回给我?
答案 0 :(得分:0)
为了了解发生了什么,我整理了以下CGI脚本:
use open ':std', ':encoding(UTF-8)';
use strict; use warnings;
use CGI;
use Encode;
run();
sub run {
my $cgi = CGI->new;
if ( $cgi->param ) {
show_result($cgi);
}
else {
show_form($cgi);
}
}
sub show_result {
my $cgi = shift;
my $search_term = decode('UTF-8', $cgi->param('search_term') );
print $cgi->header(
-type => 'text/plain',
-charset => 'UTF-8',
), $search_term, "\n";
}
sub show_form {
my $cgi = shift;
print $cgi->header(
-type => 'text/html',
-charset => 'UTF-8',
),
<<EO_HTML;
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Test</title>
</head>
<body>
<form name="search" id="search" accept-charset="UTF-8">
<p>Search term: <input type="text" name="search_term" id="search_term"></p>
<p><input type="submit"></p>
</body>
</html>
EO_HTML
}
现在,当我运行这个并复制&amp;将ЛИКЕРВИШНЕВЫЙ粘贴到输入字段中,我得到完全相同的字符串回显给我。
Firefox的位置字段实际显示:http://test.localdomain:8080/cgi-bin/test.pl?search_term=ЛИКЕР+ВИШНЕВЫЙ
但是将该字符串复制并粘贴到此文本框中会给我http://test.localdomain:8080/cgi-bin/test.pl?search_term=%D0%9B%D0%98%D0%9A%D0%95%D0%A0+%D0%92%D0%98%D0%A8%D0%9D%D0%95%D0%92%D0%AB%D0%99