【问题标题】:Encode cgi scripts UTF-8 or not?是否对 cgi 脚本进行 UTF-8 编码?
【发布时间】:2011-11-19 03:12:16
【问题描述】:

在阅读了有关编码和字符集的基础知识以及所有这些内容之后,我一直将我的所有网站都编码为 UTF-8。 我刚刚上传了一个 UTF-8 编码的 cgi 脚本。它从 HTML 表单(也是 UTF-8)读取数据,我不断收到 500 错误。 我什至编写了一个脚本只是为了说“好的”,但它不起作用。我的意思是,不读取表单,不读取任何内容,只打印一行。

#!/usr/bin/perl
use utf8;
BEGIN {
    $| = 1;
    open (STDERR, ">&STDOUT");
    print qq~Content-type: text/html\n\n~;
}
print "ok";

我已经移动了使用“utf8;”在 BEGIN 块下方,没有任何工作。所以,500 错误表示脚本没有被读取,就像它没有 755 权限一样(它有)。

所以,我的问题不是关于读取 UTF8 数据,而是关于运行 UTF8 编码的 perl 脚本。

我应该让我的脚本保持 ANSI 编码(并解决从 HTML 表单中读取 utf8 数据的工作)吗?

我在 Linux 上的 Apache 上运行了 Perl 5.8。而且...如果我将脚本编码为 Ansi,它运行良好(除了 UTF-8 字符的读取,但这是另一回事)

【问题讨论】:

  • 注释掉你的open 行,看看会发生什么。
  • 你的脚本中没有非ASCII字符,只要没有127以上代码的字符,UTF-8就完全等价于ASCII。你说如果你“编码脚本就行”到安西”。你究竟是如何改变它以使其工作的?在您发布的代码中,不需要 BEGIN 块;删除 BEGIN {} 应该没有区别。
  • 检查服务器的日志文件中的实际错误。说你有 500 错误是没有用的。

标签: perl utf-8 cgi


【解决方案1】:

use utf8 仅表示您的 Perl 源代码是 UTF-8。它与脚本是否可以处理表单中的 UTF-8 数据无关。

如果您的脚本在您添加 use utf8; 行时停止工作,那么我看到两个可能的问题:

  1. 您的 Perl 安装有问题,因此在尝试加载 utf8.pm 或(更有可能)时出现错误

  2. 当您将文件保存为 UTF-8 时,您的编辑器会插入 BOM。 BOM 干扰了#! 处理,因此您的脚本无法运行。

【讨论】:

  • 感谢大家。正如 cjm 所说,问题出在 BOM 上。只要我编码“没有 BOM”,脚本就运行良好。这对我来说有点棘手。我希望这个小答案可以在未来对其他人有所帮助。
  • 如果您将其标记为“答案”,将来可能会对其他人有更大的帮助
猜你喜欢
  • 2011-02-27
  • 1970-01-01
  • 2019-01-10
  • 2015-07-09
  • 1970-01-01
  • 2012-10-29
  • 2014-02-18
  • 2011-04-23
  • 2015-10-26
相关资源
最近更新 更多