ユーザ用ツール

サイト用ツール


perl:cgi

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フラグを立てることも忘れずに。

perl/cgi.txt · 最終更新: 2018/07/20 13:34 by taka