CGI::Application で Web アプリを作っているのですが,表示する画面が文字化けしました.
原因調査
CGI::Application はデフォルトのテンプレートエンジンとして HTML::Template を使いますが,HTML::Template が utf-8 で書かれたテンプレートファイルを読み込む場合に文字化けするという事象は多数報告されています.
- HTML::Templateでutf-8のテンプレートを読み込むと文字化けしてしまい- Perl | 教えて!goo
- http://d.hatena.ne.jp/shunkoh/20080524/1211566430
- http://d.hatena.ne.jp/perlcodesample/20090125/1231608261
基本的な対策としては,PerlIO 経由でテンプレートファイルを open した後,そのファイルハンドルを HTML::Template に渡すとか,ブラウザに出力する前にエンコードするフィルタをっけるとか,そういう形の対策が多いのですけど,ぼくはなかなか治らなかった.
いきなり結論になりますが,Web サーバが返す Content-Type ヘッダの charset がそもそも utf-8 ではなく ISO-8859-1 になっていたというのが原因.
そりゃ ISO-8859-1 を表示しようとしているブラウザに utf-8 のコンテンツを送ると文字化けするのも当然か.
一応 CGI が作成する HTML 中の meta タグで charset 指定してみたんですけど,うまくいきませんでした.この辺の動作はよくわからないです.
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />