我正在尝试在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
任何想法有什么不对?
答案 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,您应该做两件事:
确保您的浏览器了解您已向其提供UTF-8。你已经做到了。
确保您打印的变量值为UTF-8。这是导致很多问题的部分。例如,如果从数据库或CGI参数或其他任何内容中获取某些值,则应确保将其内部存储为UTF-8字符串。在大多数情况下,这意味着您应该在该标量上明确运行utf8::decode
,例如如果$stan
是保留您打印值的变量,只需在打印前放入以下行:
utf8::decode($stan);
源代码中的use utf8;
指令意味着脚本本身是UTF-8。这意味着您不需要明确地utf8::decode
字符串常量,因为它们已经是UTF-8。但是,如果您的stán
来自某些外部来源(例如数据库),则仍需要utf8::decode
。