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



我有以下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 "$wn";

我想把它称为cgi-bin/script.pl?words=É,但当我这样做时,打印的不是UTF-8,而是乱码:

   É 

有什么方法可以将cgi-bin与utf8一起使用吗?

您的行use utf8除了在源文件本身中允许UTF-8字符之外,对您没有任何作用。您必须确保输出句柄(在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;

我的CGI脚本一直存在utf8编码间歇性失败的问题。

我尝试了所有的方法,但都不能可靠地重复这个问题。

我最终发现,在使用CGI 的每个模块中使用utf8杂注是绝对关键的

use CGI qw(-utf8);

似乎发生的情况是,modperl每次请求只调用CGI模块一次。如果CGI模块的包含不一致,比如说,对于一些只使用重定向函数的实用程序函数,您还没有设置utf8杂注。然后这个调用可以是modperl决定用来解码请求的调用。

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

此外,你所要求的比你想象的要复杂。短语"使用带有utf8的cgi-bin"中隐藏了许多层,从你的接口到你用来向网络服务器发送请求的任何工具,再到该工具解析响应并将其呈现给你。你需要充分理解所有这些层,至少能够判断问题是否存在于你的CGI脚本中。例如,如果问题是bashcurl在命令行参数的编码上不一致,那么如果您的脚本工作得很好,那也无济于事。

最新更新