如何在Perl中删除CGI默认的元字符集编码?

5

使用Perl代码


#!/usr/bin/perl

use strict;
use warnings;
use CGI ":all";
use Encode;

my $cgi = new CGI;

$cgi->charset('utf-8');

print $cgi->header(-type    => 'text/html',
                   -charset => 'utf-8');

print $cgi->start_html(-title => 'Test',
                       -head  => meta({-http_equiv => 'Content-Type',
                                       -content => 'text/html; charset=utf-8'}));
my $text = 'test'; # for now

Encode::from_to($text, 'latin1', 'utf8');

print $cgi->p($text);
print $cgi->end_html;

我得到了以下输出:
Content-Type: text/html; charset=utf-8

<!DOCTYPE html
        PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
<head>
<title>Test</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<p>test</p>
</body>

我不知道为什么输出里会有这个 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />,也不知道如何去掉它。欢迎提出任何建议。
2个回答

4

start_html 中添加一个 -encoding 参数,不要手动构建 meta 元素。(尽管 CGI 文档建议您这样做)。

print $cgi->start_html(-title => "Test", -encoding => "utf-8")

这只是在HTML中添加了一个'<meta>'元素,它不会改变由Content-Type HTTP头发送的字符集。 - Flimm

4

最近版本的CGI.pm(我当前安装了3.52版)已经不需要手动构建<meta>元素。只需在调用header方法时提供字符集即可。下面是一个示例程序:

#!/usr/bin/perl

use strict;
use warnings;
use CGI ":all";
use Encode;

my $cgi = CGI->new;
binmode STDOUT, ':utf8';

print $cgi->header(-type => 'text/html',
                   -charset => 'utf-8');

print $cgi->start_html(-title => 'Test');
my $text = "\x{201c}test\x{201d}"; # for now

print $cgi->p($text);
print $cgi->end_html;

给我这个输出:
Content-Type: text/html; charset=utf-8

<!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
<head>
<title>Test</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<p> test </p>
</body>
</html>

1
你使用的CGI.pm版本是什么? - cjm
start_html 中应该使用 -encoding 而不是 -charset - evil otto
@cjm - #evilotto 的评论是正确的,解决了我的问题。我不确定你的系统,也许你的默认编码是 utf8,所以你的代码在脚本修改之前就可以正常工作。谢谢,感谢你的时间和帮助! - Ωmega
1
@stackoverflow,你从未回答过你使用的CGI.pm版本。我很好奇为什么它对你不起作用。 - cjm
1
如果您查看Changes文件,您会看到:“版本3.16,2006年2月8日... 7.修复了start_html()和header()中的字符集不同步的问题。”所以您发现了一个错误,在下一个版本中得到了修复(现在已经发布了6年)。 - cjm
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接