utf8でCGIを作る時の注意点

utf8で出力し、入力もおそらくutf8と言うCGIの場合。
使う物。

  • use CGI;
  • use utf8;
  • Encode::Guess;

CGIモジュールを利用してフォームから入力されたパラメータを受け取るが、その値にはutf8フラグがついていない(場合がある。バージョン違いとかで)。
なので、アプリケーションの下準備として、それらの値にutf8フラグを付与する必要がある。(はず)
そこで、以下のようなメソッドを作成した。

sub encode {
	my ( $self, $word ) = @_;
	$word or return $word;
	my $enc = guess_encoding($word, qw/utf8 euc-jp shiftjis 7bit-jis/);
	if ( ref $enc ) {
		$word = $enc->decode($word);
	} else {
		utf8::decode($word);
	}
	return $word;
}

第一引数に文字コード未確定の文字列を入れる。
Encode::Guessを使って文字コードを確定できれば、それをutf8に変換して返す。
確定できなければ、utf8であると推定し、無理矢理utf8フラグを付与して返す。
現在のところ、これでうまく行く。