【问题标题】:how to use utf-8 in a perl cgi-bin script?如何在 perl cgi-bin 脚本中使用 utf-8?
【发布时间】:2014-09-22 19:32:47
【问题描述】:

我有以下 cgi bin 脚本:

 #! /usr/bin/perl
 #

 use utf8;

 use CGI;
 my $q = CGI->new();
 my %params = $q->Vars;

 print $q->header('text/html');

 $w = $params{"words"};

 print "$w\n";

例如,我希望能够将其称为 cgi-bin/script.pl?words=É,但是当我这样做时,打印的不是 UTF-8,而是乱码:

   É 

有什么办法可以将 cgi-bin 与 utf8 一起使用吗?

【问题讨论】:

  • 如果你没有在你的标题中指定-charset,你会得到ISO-8859-1的默认值。你也应该在STDOUT 上设置一个编码。

标签: perl web encoding utf-8 cgi


【解决方案1】:

您的use utf8 行对您没有任何帮助,除了在源文件本身中允许使用UTF-8 字符。您必须确保输出句柄(在STDOUT 以及任何文件上)设置为utf8。处理此问题的一种简单方法是 utf8::all 模块。此外,请确保发送正确的标头,并使用 -utf8 CGI pragma 将传入参数视为 UTF-8。最后,一如既往,一定要使用严格和警告。

以下内容应该可以帮助您入门:

#!/usr/bin/perl

use strict;
use warnings;

use utf8::all;
use CGI qw(-utf8);

my $q = CGI->new;
print $q->header("text/html;charset=UTF-8");
print $q->param("words");

exit;

【讨论】:

    【解决方案2】:

    如果您从阅读perlunitutperlunicode 文档页面开始,从长远来看,您会减轻很多痛苦。他们将向您提供有关 Unicode 和字符编码究竟是什么以及如何在 Perl 中使用它们的基础知识。

    此外,您要求的内容比您想象的要复杂。短语“将 cgi-bin 与 utf8 结合使用”中隐藏了许多层,从您用于向 Web 服务器发送请求的任何工具的界面开始,到该工具解析响应并将其呈现给您。您需要充分了解所有这些层,以便至少能够判断问题是否出在您的 CGI 脚本中。例如,如果问题是 bashcurl 不同意您的命令行参数的编码,那么如果您的脚本完美运行也无济于事。

    【讨论】:

      【解决方案3】:

      我的 CGI 脚本遇到了 utf8 编码间歇性失败的问题。 我尝试了所有方法,但无法可靠地重复该问题。

      我终于发现,在每个使用 CGI 的模块中与您使用 utf8 pragma 保持一致是绝对关键的

      使用 CGI qw(-utf8);

      似乎发生的情况是 modperl 每个请求只调用一次 CGI 模块。如果 CGI 模块的包含不一致 - 例如对于某些仅使用重定向功能的实用程序功能并且您没有费心设置 utf8 pragma。那么这个调用可以是 modperl 决定用来解码请求的调用。

      【讨论】:

        猜你喜欢
        • 2011-06-26
        • 1970-01-01
        • 2012-03-10
        • 2010-11-29
        • 1970-01-01
        • 1970-01-01
        • 2021-02-20
        • 1970-01-01
        相关资源
        最近更新 更多