-2

$cgi->param('search_string');Perlスクリプトでurlパラメータを取得するために使用しますが、取得する前に値が関数$cgi->paramを介して渡されていると思われます。uri_unescape()

例:

  1. フォームにはsearch_string=ЛИКЕР ВИШНЕВЫЙ
  2. URLには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 に答える