应该使用CGI.pm的header方法输出Content-Type标头?

时间:2010-01-20 10:57:47

标签: perl header cgi

如果我在Perl中使用CGI模块,我可以这样做

$cgi = CGI->new();
$cgi->header(-type=>"text/html");

或者去寻找经典

print "Content-Type: text/html\r\n\r\n";

我们使用的是否重要?这两者有什么区别吗?两者似乎都有效。

对我来说,如果我使用CGI,我会选择第一个,但如果没有,那么我就不会因为只有一个动作而加载模块。但只是想知道这个问题是否有任何意义?

精神科

4 个答案:

答案 0 :(得分:2)

严格来说,你必须打印\ r \ n字符:

print "Content-Type: text/html\r\n\r\n"

是表达您想说的内容的合法方式。

一般来说,我会坚持使用CGI提供的功能。 它允许更简洁和可读的代码,CGI比你更了解这些细节。

答案 1 :(得分:2)

严格来说,您必须打印CRLF对。这与“\ r \ n \ r \ n”不同,除非您先使用binmode STDOUT

print "Content-Type: text/html\r\n\r\n";
C:\Temp> t | xxd
0000000: 436f 6e74 656e 742d 5479 7065 3a20 7465  Content-Type: te
0000010: 7874 2f68 746d 6c0d 0d0a 0d0d 0a         xt/html......

您应该使用CGI.pm。或者,如果像我一样,您不想要所有的历史包袱,请使用CGI::Simple

答案 2 :(得分:0)

在perl中,转义码“\ r”和“\ n”不能保证与“\ 015”和“\ 012”相同。

如果要为网络协议打印CRLF,则应使用“\ 015 \ 012”或“\ cM \ cJ”。

这是引用,直接来自perldoc perlop:

  

所有系统都使用虚拟“\ n”来表示行终止符,   称为“换行符”。没有不变的,物质的东西   换行符。操作系统只是一种幻觉,   设备驱动程序,C库和Perl都密谋保留。不   所有系统都将“\ r”读作ASCII CR,将“\ n”读作ASCII LF。例如,   在过去的古代Mac(前MacOS X)上,这些曾经是   反转,在没有行终止符的系统上,打印“\ n”可能   不发出实际数据。一般来说,当你的意思是“换行符”时,请使用“\ n”   对于您的系统,但在需要精确时使用文字ASCII   字符。例如,大多数网络协议期望并且更喜欢a   CR + LF(“\ 015 \ 012”或“\ cM \ cJ”)用于行终止符,尽管如此   他们经常只接受“\ 012”,他们很少只容忍“\ 015”。如果   你养成了使用“\ n”进行网络化的习惯,你可能会被烧毁   有一天。

来自perldoc -f binmode的类似信息:

  

操作系统,设备驱动程序,C库和Perl运行时   系统都密谋让程序员处理一个字符(\ n   )作为线路终结器,不考虑外部表示。上   许多操作系统,本机文本文件表示匹配   内部表示,但在某些平台上是外部的   \ n的表示由多个字符组成。

     

VMS上Unix,Mac OS(旧版和新版)以及Stream_LF文件的所有变体   使用单个字符结束外部表示中的每一行   文本(即使这个单字符是旧的CARRIAGE RETURN,   早期的Darwin风格的Mac OS,在Unix和大多数VMS上都是LINE FEED   文件)。在其他系统,如OS / 2,DOS和各种风格的   MS-Windows,您的程序将\ n视为一个简单的\ cJ,但存储的是什么   在文本文件中是两个字符\ cM \ cJ。这意味着,如果你   不要在这些系统上使用binmode(),磁盘上的\ cM \ cJ序列将是   在输入时转换为\ n,程序中的任何\ n都将被转换   返回\ cM \ cJ输出。这是你想要的文本文件,但它   对二进制文件来说可能是灾难性的。

答案 3 :(得分:0)

糟糕的使用

print "Content-Type: text/html\r\n\r\n"

如果您想使用 CGI 添加内容类型 Cookie ,则无法添加其他标题,此处为工作示例解决方案p>

my $cgi = CGI->new;
my $cookie = $cgi->cookie(-name  => 'CookieName', -value => 'CookieValue');

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