====== Perl - CGI ======
===== CGIでUTF8を扱う =====
CGIモジュールとEncodeモジュールを使うとよい。
#!/usr/bin/perl
BEGIN {
use File::Basename;
chdir dirname($0);
}
use strict;
use warnings;
use utf8;
use open ":utf8";
use open ":std";
use CGI;
use Encode;
# 取得したデータをUTF8として扱うためにデコード
my $cgi = CGI->new();
foreach my $param ($cgi->param) {
my @value = map {Encode::decode("utf8",$_)} $cgi->param($param);
$cgi->param($param,@value);
}
これだけでCGIで正常にUTF8が扱えるようになる。\\
CGIモジュールで取得した変数をハッシュにするには、
my %in = $cgi->Vars;
たったこれだけでよい。
===== Cookieの書き込みと読み込み =====
==== 書き込み ====
#!/usr/bin/perl
BEGIN {
use File::Basename;
chdir dirname( $0 );
}
use strict;
use warnings;
use utf8;
use open ":utf8";
use open ":std";
use CGI::Cookie;
my $cookie = CGI::Cookie->new(-name => "識別子", -value => "値", -expires => "+3M");
print "Set-Cookie: $cookie\n";
//-expires//は有効期限を設定するもので、//+3M//は三ヶ月間を意味する。
==== 読み込み ====
#!/usr/bin/perl
BEGIN {
use File::Basename;
chdir dirname($0);
}
use strict;
use warnings;
use utf8;
use open ":utf8";
use open ":std";
use CGI::Cookie;
my %cookies = fetch CGI::Cookie;
my $cookie = $cookies{"識別子"}->value if (exists $cookies{"識別子"});
my $result = Encode::decode("utf8",$cookie);
存在しないクッキーを取得しようとすると致命的なエラーとなるため、必ずexistsで存在を確認する。\\
取得した値に対してUTF-8フラグを立てることも忘れずに。