Perl UTF8在CGI中的问题

Vij*_*jay 0 perl cgi utf-8

我有一个非常简单的Perl脚本,它可以在终端上正常运行,但是当作为CGI脚本运行时,会产生垃圾。该脚本基本上采用HTML实体编码的数据,并将其转换为打印数据。我已经尝试了所有不同的设置,例如使用“编码”来更改输出并将STDOUT设置为utf8模式,但这没有帮助。我还尝试过更改CGI的环境,以查看事情是否会像终端环境一样工作。仍然没有运气。

这是脚本

#!/usr/bin/perl 
use HTML::Entities qw(encode_entities_numeric decode_entities);
use Encode qw/encode decode/;
binmode(STDOUT, ":utf8");
#$ENV{'PERL_UNICODE'} = 'D';
#$ENV{'LANG'} = 'en_US.UTF-8';
#$ENV{'TERM'} = 'vt100';
#$ENV{'SHELL'} = '/bin/bash';
#binmode(STDOUT, ":utf8");
print "Content-type: text/html\n\n";
my $y = decode_entities("Συστήματα_&#x
391;νίχνευσης_Εισ.pd
f");
#print encode("UTF8",$y);
print $y;
Run Code Online (Sandbox Code Playgroud)

终端上的输出很干净,就像perl test.pl内容类型:text / html

?????????? _ ???????????? _ ???。pdf

但是在CGI打印中,它是乱码的…

我有点困惑,因为我找不到任何简单的方法来解决这个问题。尝试了变量的“ encode_utf8”和utf8 :: upgrade,但还是没有运气。任何人在这里的经验都会有很大帮助!

谢谢维杰

amo*_*mon 6

解释HTML文档时,浏览器需要知道编码。根据HTML标准的默认编码不是UTF-8。由于浏览器假设编码错误,因此会读取垃圾内容。

相反,您应该明确指定编码,例如通过打印一个meta标签

<meta charset="utf-8">
Run Code Online (Sandbox Code Playgroud)

或在内容类型中包含编码:

Content-type: text/html; charset=utf-8
Run Code Online (Sandbox Code Playgroud)

在这里,使用内容类型似乎是最合适的。

  • @Vijay,评论不是问新问题的地方。不要忘记包括传递给open的变量的特定内容,以及readdir返回的特定文件名。您可以使用sprintf“%vX”,$ var`。 (2认同)