如何在CGI脚本中使用UTF-8?

时间:2014-10-29 15:33:22

标签: perl web cgi

我正在尝试在CGI脚本中使用UTF-8字符。

我正在使用CGI脚本的以下标题:

#! /usr/bin/perl
#

use utf8;

use open ':std' => ':encoding(UTF-8)';

use CGI '-utf8';

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

print $q->header( -type => "text/html", -charset => "UTF-8" );
print $q->start_html( -encoding => "UTF-8" );

问题在于,无论何时我将某些东西打印到标准输出,我都会在浏览器上输出如下内容:

st\xE1n

而不是

stán

任何想法有什么不对?

2 个答案:

答案 0 :(得分:2)

使用use CGI '-utf8';表示输入应使用UTF-8进行编码。

utf8 "\xE1" does not map to Unicode表示您的输入未使用UTF-8进行编码。

脚本没有输出stán,因为stán没有提供给脚本。

答案 1 :(得分:0)

正如@ikegami所说,你的输入看起来不像UTF-8。

通常,要使CGI输出有效UTF-8,您应该做两件事:

  1. 确保您的浏览器了解您已向其提供UTF-8。你已经做到了。

  2. 确保您打印的变量值为UTF-8。这是导致很多问题的部分。例如,如果从数据库或CGI参数或其他任何内容中获取某些值,则应确保将其内部存储为UTF-8字符串。在大多数情况下,这意味着您应该在该标量上明确运行utf8::decode,例如如果$stan是保留您打印值的变量,只需在打印前放入以下行:

  3. utf8::decode($stan);
    

    源代码中的use utf8;指令意味着脚本本身是UTF-8。这意味着您不需要明确地utf8::decode字符串常量,因为它们已经是UTF-8。但是,如果您的stán来自某些外部来源(例如数据库),则仍需要utf8::decode