Попытка запустить старые CGI-скрипты под FastCGI. Печать без дополнительных параметров дает правильный вывод: print $q->div( $q->param("text") )
Но при печати с хэшем дополнительных параметров для CGI-методов print $q->div( {-id=>"id"}, $q->param("text") )
он разрушает сформированные данные UTF-8 ('õäöüžš' -> 'õäöüžš')
Это происходит только с параметрами CGI, в скриптах определенные переменные работают нормально (примеры 3 и 4). Все отлично работает под обычным CGI (с флагом -utf8).
Пример сценария, превращенного в FastCGI, называемый test.fcgi?text=õäöüžš
, должен давать четыре равных блока:
#!/usr/bin/perl -w --
use strict;
use CGI::Fast qw(:all);
use locale;
use utf8;
BEGIN {
binmode(STDIN); # Form data
binmode(STDOUT, ':encoding(UTF-8)'); # HTML
binmode(STDERR, ':encoding(UTF-8)'); # Error messages
}
my ($q) = ();
my $test = "õäöüžš";
while ($q = new CGI::Fast) {
print $q->header(-type=>"text/html", -charset=>"utf-8"),
$q->start_html(-encoding=>"utf-8");
print "1: ",
$q->div( $q->param('text') ),
"<br />",
"2: ",
$q->div( {-id=>"id"}, $q->param('text') ),
"<br />",
"3: ",
$q->div( $test ),
"<br />",
"4: ",
$q->div( {-id=>"id"}, $test ),
$q->end_html();
}
Первый блок в порядке, второй сломан, 3 и 4 также в порядке:
Обычный CGI-пример, который дает все 4 правильных пути:
#!/usr/bin/perl -w --
use strict;
use CGI qw(:all -utf8);
use locale;
use utf8;
BEGIN {
binmode(STDIN); # Form data
binmode(STDOUT, ':encoding(UTF-8)'); # HTML
binmode(STDERR, ':encoding(UTF-8)'); # Error messages
}
my ($q) = ();
my $test = "õäöüžš";
$q = new CGI;
print $q->header(-type=>"text/html", -charset=>"utf-8"),
$q->start_html(-encoding=>"utf-8");
print "1: ",
$q->div( $q->param('text') ),
"<br />",
"2: ",
$q->div( {-id=>"id"}, $q->param('text') ),
"<br />",
"3: ",
$q->div( $test ),
"<br />",
"4: ",
$q->div( {-id=>"id"}, $test ),
$q->end_html();
Мне кажется, что в FastCGI form-data нет флага utf8, и я не понимаю, как его правильно форсировать? Под CGI.pm я объявляю как:
use CGI qw(:all -utf8);
а как с FastCGI?