Perl 默认情况下,cgi->param是否使用uri_unescape?

Perl 默认情况下,cgi->param是否使用uri_unescape?,perl,character-encoding,internationalization,cgi,Perl,Character Encoding,Internationalization,Cgi,我使用$cgi->param'search_string';在我的Perl脚本中检索url参数,但我怀疑$cgi->param值在我获取它之前正在通过uri_unescape函数传递 例如: 该表单有一个搜索字符串= url的搜索字符串=%41B%418%41A%415%420+%412%418%428%41D%415%412%42B%419 但是$cgi->param'search_string'返回的是ABA8AAA5B0+A2A8B8ADA5A2BBA9,而不是我可以简单解码的%41B%4

我使用$cgi->param'search_string';在我的Perl脚本中检索url参数,但我怀疑$cgi->param值在我获取它之前正在通过uri_unescape函数传递

例如:

该表单有一个搜索字符串= url的搜索字符串=%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_字符串传递

$search_string =~ s/\s/+/g;
$search_string =~ s/\#/\%23/g;
$search_string =~ s/[^A-Za-z0-9\+\*\.\@\_\-]/uc sprintf("%%%02x",ord($&))/egx;
从中我得到了URL本身中的搜索字符串=%41F%41B%415%41D%41A%410+%41F%418%429%415%412%410%42F

然后,当我使用$cgi->param'search_string'在另一端检索该值时,我得到这个AFABA5ADAA0 AFA8B9A5A2A0BF。这里的另一个问题是,$cgi->param'search_string'似乎会自动调用uri_unescape,这就是为什么我会得到AFABA5ADAAA0 AFA8B9A5A2A0BF


我如何才能使最终结果以ПЛББПППЩБСАЯ的形式返回给我?

为了了解发生了什么,我整理了以下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
}
现在,当我运行此命令并将ЛБББББССББББББЙ复制并粘贴到输入字段中时,我得到了完全相同的字符串


Firefox的位置字段实际上显示:http://test.localdomain:8080/cgi-bin/test.pl?search_term=http://test.localdomain:8080/cgi-bin/test.pl?搜索项=%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

显示一些代码,它复制了这种行为。您可能在编码方面有问题,而不是CGI方法。用法。我在问题中添加了我的代码,请告知您是否知道如何修复此问题注:使用CGI-utf8可以替换参数上的手动编码::解码步骤。除了perldoc CGI声明这使得CGI.pm将所有参数视为UTF-8字符串。小心使用,因为它会干扰二进制上传的处理。最好手动选择希望返回utf-8字符串的字段,并使用如下代码进行转换: