Perlで標準入出力を使うことはよくあることで、use Encode;宣言をした後に、binmode STDIN, “encoding(utf8)” や open($fh, “:encoding(utf8)”, $fn) とするなどしてutf8文字が適切に処理されるようにするが、パイプを利用する場合、STDIN/STDOUT に対する binmode では適切に処理がなされないので、open関数に対する設定を用いる必要がある。たとえば、
open($fh, "-|:encoding(utf8)", $command);
とする。
また、DBIモジュールを用いたMySQLとのやりとりで適切にutf8文字を処理させるためには、DBI->connectを行う際に、mysql_enable_utf8 => 1を明示する必要がある。すなわち、
my $dbh = DBI->connect("dbi:mysql:$dbname;$host:$port", $user, $pass,
{mysql_enable_utf8 => 1});
といったイメージ。なお、これはMySQLサーバーに対するutf8の設定も適切に行われていることが条件。
MySQLコンソールで下記のコマンドを発行すると状況が確認出来る。
show variables like "char%";
これに対して以下の様な結果が得られれば問題無し。
+--------------------------+--------------------------------------------------------+ | Variable_name | Value | +--------------------------+--------------------------------------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/local/mysql/5.0.91/share/mysql/charsets/ | +--------------------------+--------------------------------------------------------+
参考サイト