2014年3月2日日曜日

FreeBSD 上での Perl の UTF-8 の文字化けではまる

 久々に FreeBSD ではまってしまった。 何にハマったかというと,Perl の UTF-8 テキスト文字列の取扱いでハマった。 Perl + cgi と apache 2.2 で web を運用し,かつ,PostgreSQL で運用しているデータベースの情報を web に載せている。 その際,Perl 内部での日本語文字列(より正確には UTF-8 の文字列)の encoding というので文字化けが発生してしまい,頭が混乱してしまった。 今回はこの件について書こう。
 先に最終的に今回私が採用した解決方法を書いておこう。 私が採用した解決方法は,Perl スクリプトの先頭付近に
use utf8;                            # use utf8 in Perl
use open ':encoding(UTF-8)';         # input/output default encoding is UTF-8
use open ':std';                     # STDIN, STDOUT, STDERR is set equal to "use open ':encoding(UTF-8)';"
という記述を書き,cgi の form でやりとりした文字列に対しては,
$input_string = Encode::decode('utf8', $input_string);
のようにして,文字列のエンコーディングを変換する,という作戦である。

1. システム構成
 まず,今回の件の動作環境について書いておこう。
私は,個人的なサイトのために FreeBSD でサーバーを運用している。 サーバーと言っても,マシン自体はちょっと古くなった Windows の Note PC を格下げして使っているのだが…。 サーバー上では,現在 FreeBSD release 9.0 を動かしている。 その上で,apache 2.2 で web site を立ち上げている。 web site は,主に cgi を使って運用している。 cgi を使うには Perl が必要なのだが,FreeBSD では「当然」Perl は最初から入っている。 現在の Perl のバージョンは,5.18 にしている。 さらに,データの管理のためにデータベースを運用している。 データベース用のアプリケーションは PostgreSQL 9.2.7 を運用している(今回の件で 9.3.3 にあげたが…)。