gpt4 book ai didi

perl - 如何强制 FastCGI 将表单数据编码为 UTF-8,因为 CGI.pm 有选项?

转载 作者:行者123 更新时间:2023-12-04 03:13:17 26 4
gpt4 key购买 nike

尝试在 FastCGI 下运行旧的 CGI 脚本。不带额外参数的打印会给出正确的输出:print $q->div( $q->param("text") )

但是当使用 CGI 方法的额外参数散列打印时 print $q->div( {-id=>"id"}, $q->param("text") ) , 它破坏了 UTF-8 格式的数据 ('õäöüžš' -> 'õäã¶Ã¼Å¾Å¡')

它只发生在 CGI 参数中,在脚本中定义的变量工作正常(示例 3 和 4)。在普通 CGI(带有“-utf8”-flag )下一切正常。

FastCGI 转换的示例脚本,称为 test.fcgi?text=õäöüžš 应该给出四个相等的 block :

#!/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();

}

第一 block 很好,第二 block 坏了,第三和第四 block 也很好:

普通的 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 表单数据没有打开 utf8 标志,我不明白,如何正确地强制它?在 CGI.pm 下我声明为:

use CGI qw(:all -utf8);

但是如何使用 FastCGI?

最佳答案

1) CGI::FastCGI.pm 的子类, 因此您可以指定相同的导入参数。

use CGI::Fast (-utf8);

2) FCGI流是使用较旧的流 API 实现的,TIEHANDLE .使用 binmode() 应用 PerlIO 层没有效果。正确的解决方案是在输出数据之前对其进行编码,但如果那不是一个选项,我可以提供此热补丁:

#!/usr/bin/perl
use strict;
use warnings;
use utf8;

use CGI::Fast (-utf8);
use FCGI ();
use Encode ();

my $enc = Encode::find_encoding('UTF-8');
my $org = \&FCGI::Stream::PRINT;
no warnings 'redefine';
local *FCGI::Stream::PRINT = sub {
my @OUTPUT = @_;
for (my $i = 1; $i < @_; $i++) {
$OUTPUT[$i] = $enc->encode($_[$i], Encode::FB_CROAK|Encode::LEAVE_SRC);
}
@_ = @OUTPUT;
goto $org;
};

my $literal = "õäöüžš";

while (my $q = CGI::Fast->new) {
print $q->header(-type => "text/html", -charset => "UTF-8"),
$q->start_html(-encoding => "UTF-8"),
$q->p("Text 1:" . $literal),
$q->p("Text 2:" . $q->param('text')),
$q->end_html;
}

关于perl - 如何强制 FastCGI 将表单数据编码为 UTF-8,因为 CGI.pm 有选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5005104/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com