今の開発は、DB, HTML, プログラムの文字コードを全てUTF-8で統一している。そうすると、charsetがutf-8になるので、ブラウザから送信される文字もutf-8になる。それを受け取って、DBにutf-8で書き込む。DBのデータを画面に出力する場合もDBからUTF8でデータを取得し、それをhtmlに出力してブラウザに送信するだけ。これで、全てUTF-8に統一できて、文字コード変換が必要ないので、変な文字化けに悩まされずにすむ。
と思ってたら、、ある文字を入力すると文字化け、もしくは「DBD::Pg::st execute failed: ERROR: invalid UTF-8 byte sequence detected near byte ....」というDBエラーが出た。
環境は、PostgreSQL8 + perl5.6 + DBD::PGです。
何でかなぁと思ってたら、どうやらCGIモジュールのescapeHTMLメソッドを使っている箇所で発生している模様。
CGIモジュールは、インスタンスを生成した後に、以下のような感じでcharsetを指定しないとデフォルトで、ISO-8859-1として扱うため、変に文字コード変換されてひっかかったみたい。
my $cgi = new CGI; $cgi->charset('utf-8');