2010-01-20 23 views
3

如果我使用在Perl CGI模块,我可以做到这一点应该使用CGI.pm的头部方法输出Content-Type头部?

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

或去经典

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

会有问题,我们使用?两者有什么区别?两者似乎都有效。

对于我来说,如果我使用CGI反正我会第一个,但如果不是,那么我不会为一个动作加载模块而烦恼。但只是想知道这个问题上是否有任何事情?

精神科

+0

'text/html' ** not **'text \ html'。你应该得到'无法识别的转义\ h通过......'你不使用'警告'吗?或者,你是不是发布你正在使用的确切代码?无论哪种方式,* tsk *,* tsk *。 – 2010-01-20 11:21:04

+0

对不起,这只是我的头。我敢肯定,人们知道这样做的正确方法:) – Psytronic 2010-01-20 11:30:47

+0

OTOH,调用'CGI'对象'$ cgi'而不是真正烦人的'$ query' ;-) – 2010-01-20 11:42:25

回答

2

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

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

是表达你想说什么合法途径。

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

+0

对不起,忘了\ r's编辑代码来反映。谢谢 – Psytronic 2010-01-20 11:10:45

+0

同意。 CGI是相当大的,所以你需要一点运行时间的速度。 CGI :: Simple会更快地完成这项工作(假设你已经安装了它)。 – 2010-01-21 01:35:43

+0

@Psytronic:但是您忘记了\ r的事实是我为什么使用CGI.pm有意义的例子。 – reinierpost 2010-01-21 11:15:57

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

0

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

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

这里的报价,direcly从的perldoc perlop中:

所有系统使用虚拟 “\ n” 来表示一个行终止, 称为 “换行”。没有任何不变的物理 换行符。操作系统,设备驱动程序,C库和Perl都是合谋保存的,这只是一种幻想。不是 所有系统都将“\ r”读取为ASCII CR,将“\ n”读取为ASCII LF。例如,旧版macs(pre-MacOS X)上的 (旧版MacOS X),这些版本原来是 ,并且在没有行终止符的系统上,打印“\ n”可能 不会发出实际数据。通常,当您的系统使用“换行符” 时,请使用“\ n”,但在需要确切的 字符时使用文字ASCII。例如,大多数网络协议期望并且更喜欢用于行终止符的 CR + LF(“\ 015 \ 012”或“\ cM \ cJ”),并且尽管 他们通常只接受“\ 012”,但它们很少容忍“ \ 015“。如果 您养成了使用“\ n”进行联网的习惯,您可能有一天会被烧掉 。

多,类似的信息,从-f的perldoc binmode:

操作系统,设备驱动程序,C库和Perl运行时 系统的所有合谋让程序员治疗单一字符(\ n )作为行终止符,而不考虑外部表示。在许多操作系统上,本地文本文件表示与 的内部表示相匹配,但在某些平台上,\ n的外部 表示由多个字符组成。

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

0

不好用

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

,如果你想使用CGI添加的Content-Type饼干您不能添加另一头,在这里工作示例解决方案

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

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

它应该是'-charset =>'utf-8''。 – Sjoerd 2015-07-29 14:56:23