2014-09-22 76 views
1

我有以下的CGI脚本斌:如何在perl cgi-bin脚本中使用utf-8?

#! /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字= E例如,但是当我这样做,有什么印刷不UTF-8,而不是乱码:

É 

有什么办法可以用utf8使用cgi-bin吗?

+3

如果你没有在你的头文件中指定'-charset',你会得到默认的'ISO-8859-1'。你应该也可以在'STDOUT'上设置一个编码。 – tjd 2014-09-22 19:51:10

回答

6

您的行use utf8不会为您做任何事情,除了在源文件本身中允许使用UTF-8字符。您必须确保输出句柄(位于STDOUT以及任何文件)设置为utf8。处理这个问题的一个简单方法是utf8::all模块。另外,请确保您发送的是正确的标题,并使用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

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

此外,你要求的是比你想象的更复杂。在“使用cgi-bin和utf8”这个短语中隐藏了许多图层,从您的界面开始,您可以使用任何工具将请求发送到Web服务器,并以该工具已解析响应并将其呈现给您的方式结束。您需要足够好地理解所有这些图层,以便至少能够确定问题是否存在于CGI脚本中。例如,如果问题是bashcurl不同意您的命令行参数的编码,那么它对您的脚本完美工作没有帮助。

1

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

我终于发现,是绝对关键的伴随你使用CGI

使用CGI QW每个模块使用UTF8编译要一致(-utf8);

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