如何在perl cgi-bin脚本中使用utf-8?

时间:2014-09-22 19:32:48

标签: perl web encoding utf-8 cgi

我有以下cgi bin脚本:

 #! /usr/bin/perl
 #

 use utf8;

 use CGI;
 my $q = CGI->new();
 my %params = $q->Vars;

 print $q->header('text/html');

 $w = $params{"words"};

 print "$w\n";

我希望能够将其称为cgi-bin / script.pl?words =É例如,但是当我这样做时,打印的不是UTF-8,而是乱码:

   É 

有没有办法在utf8上使用cgi-bin?

3 个答案:

答案 0 :(得分:9)

除了在源文件本身中允许使用UTF-8字符外,您的第use utf8行不会为您做任何事情。您必须确保输出句柄(在STDOUT以及任何文件上)设置为utf8。处理此问题的一种简单方法是utf8::all模块。此外,请确保发送正确的标头,并使用-utf8 CGI编译指示将传入参数视为UTF-8。最后,一如既往,务必使用严格和警告。

以下内容可以帮助您入门:

#!/usr/bin/perl

use strict;
use warnings;

use utf8::all;
use CGI qw(-utf8);

my $q = CGI->new;
print $q->header("text/html;charset=UTF-8");
print $q->param("words");

exit;

答案 1 :(得分:1)

如果您从阅读perlunitutperlunicode文档页面开始,那么从长远来看,您将节省很多痛苦。它们将为您提供有关Unicode和字符编码的基本知识,以及如何在Perl中使用它们。

另外,你所要求的比你想象的要复杂得多。短语“使用带有utf8的cgi-bin”中隐藏了许多层,从您的界面开始,您可以使用任何工具向Web服务器发送请求,并以解析响应并将其呈现给您的工具结束。您需要充分了解所有这些层,以便至少能够判断问题是否存在于CGI脚本中。例如,如果问题是bashcurl不同意命令行参数的编码,那么如果您的脚本完美运行则无济于事。

答案 2 :(得分:1)

我一直有这个问题,我的CGI脚本使用utf8编码间歇性失败。 我尝试了一切,但无法可靠地重复这个问题。

我终于发现,在使用CGI的每个模块中使用utf8编译指示是绝对关键的

使用CGI qw(-utf8);

似乎发生的事情是modperl每次请求只调用一次CGI模块。如果CGI模块包含不一致 - 比如说某些实用程序函数只是使用重定向函数而你没有打扰设置utf8编译指示。然后,这个调用可以是modperl决定用来解码请求的调用。