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

如何在perl cgi bin脚本中使用utf-8?,perl,web,encoding,utf-8,cgi,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,而是乱码:

我有以下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,而是乱码:

   É 

有没有办法将cgi bin与utf8一起使用?

您的代码行
使用utf8
除了在源文件本身中允许使用UTF-8字符外,对您没有任何帮助。您必须确保输出句柄(在
STDOUT
以及任何文件上)设置为
utf8
。处理这个问题的一个简单方法是模块。此外,请确保发送的标题正确,并使用
-utf8
CGI pragma将传入参数视为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;

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


而且,你所要求的比你想象的要复杂。短语“use cgi bin with utf8”中隐藏了许多层,从您的接口到您用来向web服务器发送请求的任何工具,到该工具解析响应并将其呈现给您为止。您需要充分了解所有这些层,以便至少能够判断问题是否存在于CGI脚本中。例如,如果问题是
bash
curl
对命令行参数的编码不一致,那么如果您的脚本工作正常就没有帮助了。

我的CGI脚本一直存在utf8编码间歇性失败的问题。 我什么都试过了,但不能可靠地重复这个问题

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

使用CGI qw(-utf8)


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

如果不在头中指定
-charset
,则会得到默认值
ISO-8859-1
。您可能也应该在
STDOUT
上设置编码。