代码之家  ›  专栏  ›  技术社区  ›  Psytronic

应该使用cgi.pm的header方法输出内容类型header吗?

  •  3
  • Psytronic  · 技术社区  · 15 年前

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

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

    或者选择经典

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

    我们用哪一种有关系?这两者有什么区别吗?两者似乎都有效。

    对我来说,如果我使用 CGI 不管怎样,如果不是这样,我就不需要为一个操作加载模块了。只是想知道这个问题上有没有什么问题?

    PSY

    4 回复  |  直到 15 年前
        1
  •  2
  •   reinierpost    15 年前

    严格来说,您必须打印\r个字符:

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

    是表达你想说的话的合法途径。

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

        2
  •  2
  •   Sinan Ünür    15 年前

    严格来说,你必须打印 CRLF 对。除非您使用 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 .

        3
  •  0
  •   Ben Goldberg    12 年前

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

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

    以下是PerldocPerlop的Direcly引用:

    所有系统都使用虚拟的\n“来表示一个行终止符, 称为“新线”。没有不变的物质 换行符。这只是一种错觉,即操作系统, 设备驱动程序、C库和Perl都合谋保存。不是 所有系统将“r”读作ASCII CR,“n”读作ASCII LF。例如, 在昔日的古Macs(前Macos X)上,它们曾经是 在没有行终止符的系统上,打印“n”可能 不发出实际数据。一般来说,当您的意思是“换行”时使用“\n” 对于您的系统,但是当您需要 性格。例如,大多数网络协议都希望 CR+LF(“\015\012”或“\cm\cj”)用于线路终端,尽管 他们往往只接受“012”,很少只接受“015”。如果 你养成了用“n”建立网络的习惯,你可能会被烧死。 总有一天。

    更多类似信息,来自perldoc-f binmode:

    操作系统、设备驱动程序、C库和Perl运行时 System all合谋让程序员处理单个字符(\n )作为行终止符,与外部表示无关。论 许多操作系统中,本机文本文件表示与 内部表示,但在某些平台上,外部表示 表示\n由多个字符组成。

    所有Unix、Mac OS(新旧)和流文件在vms上的变体 使用单个字符结束外部表示形式中的每一行 文本(即使该单个字符是回车, 达尔文时代之前的Mac操作系统,是Unix和大多数虚拟机上的在线订阅源 文件)。在其他系统中,如OS/2、DOS和 MS Windows,您的程序将\n视为简单的\cj,但存储的内容 文本文件中有两个字符\cm\cj。这意味着如果你 不要在这些系统上使用binmode(),\cm\cj磁盘上的序列将 在输入时转换为\n,程序中的任何\n都将被转换 回到输出上的\cm\cj。这是您想要的文本文件,但它 对二进制文件来说可能是灾难性的。

        4
  •  0
  •   ewwink    12 年前

    坏的用法

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

    您不能添加另一个标题,如果您要添加,请在此处使用示例解决方案 内容类型 曲奇饼 使用 CGI

    my $cgi = CGI->new;
    my $cookie = $cgi->cookie(-name  => 'CookieName', -value => 'CookieValue');
    
    print $cgi->header( -cookie => $cookie,
                        -type    => 'text/html',
                        -charset => 'charset=UTF-8');