首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何按照CGI.pm的选项强制FastCGI将表单数据编码为UTF-8?

如何按照CGI.pm的选项强制FastCGI将表单数据编码为UTF-8?
EN

Stack Overflow用户
提问于 2011-02-15 22:50:06
回答 2查看 4.2K关注 0票数 3

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

但是,当打印出CGI-methods print $q->div( {-id=>"id"}, $q->param("text") )的额外参数哈希时,它会破坏UTF-8格式的数据(‘óäöüžš’->‘’)

只有CGI参数才会发生这种情况,在脚本定义的变量中可以正常工作(示例3和4)。在普通的CGI (使用"-utf8"-flag )下,一切都很完美。

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

代码语言:javascript
复制
#!/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();

}

第一块没问题,第二块坏了,第三块和第四块也没问题:

普通的CGI-示例给出了所有4种正确的方法:

代码语言:javascript
复制
#!/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下,我声明为:

代码语言:javascript
复制
use CGI qw(:all -utf8);

但是如何使用FastCGI呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-18 02:34:23

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

代码语言:javascript
复制
use CGI::Fast (-utf8);

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

代码语言:javascript
复制
#!/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;
}
票数 5
EN

Stack Overflow用户

发布于 2011-02-15 23:12:13

我会这样做:

代码语言:javascript
复制
use strict;
use CGI;
CGI->compile();
use CGI::Fast;
use utf8;
while (new CGI::Fast) {
    $CGI::PARAM_UTF8=1;# may be this????
    my $q =CGI->new;
    #rest of the code should work
}
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5005104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档