cgi-> param是否默认使用uri_unescape?

时间:2012-05-02 09:03:03

标签: perl character-encoding internationalization cgi

我使用$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,我可以简单地解码。
  4. 以下是我的代码中实际发生的事情:

    我将此“ПЛЕНКАПИЩЕВАЯ”作为$ 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"的原因。

    如何制作,以便最终结果以"ПЛЕНКА ПИЩЕВАЯ"的形式返回给我?

1 个答案:

答案 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