-2

我曾经$cgi->param('search_string');在我的 Perl 脚本中检索一个 url 参数,但我怀疑该值在我得到它之前$cgi->param正在通过函数传递。uri_unescape()

例子:

  1. 该表格有一个search_string=ЛИКЕР ВИШНЕВЫЙ
  2. 该网址有一个search_string=%41B%418%41A%415%420+%412%418%428%41D%415%412%42B%419
  3. $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;

search_string=%41F%41B%415%41D%41A%410+%41F%418%429%415%412%410%42F由此我在 URL 本身中得到了这个。

然后,当我使用$cgi->param('search_string')在另一端检索该值时,我得到了这个"AFABA5ADAAA0 AFA8B9A5A2A0BF"。这里的另一个问题是 $cgi->param('search_string') 似乎确实会自动调用 uri_unescape() ,这就是我得到"AFABA5ADAAA0 AFA8B9A5A2A0BF".

我如何才能使最终结果返回给我"ПЛЕНКА ПИЩЕВАЯ"

4

1 回答 1

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
}

现在,当我运行它并将ЛИКЕР ВИШНЕВЫЙ复制并粘贴到输入字段时,我得到了完全相同的字符串回显给我。

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

于 2012-05-02T13:40:15.273 回答