新しい CentOS (サーバに無料で入ってる Ver 6)の環境で、現在動作しているcgiを実行すると文字化けしてしまう現象に悩まされました。
ハマった手順を書いてみますね。
1)httpd.conf の変更
文字化けはこれでなおる!とネット上のあちこちに書いてあります。
# vi /etc/httpd/conf/httpd.conf
AddDefaultCharset off
または
#AddDefaultCharset off コメントアウト。
動作結果:NG
世界中でほとんど解決しているらしいのですが、うまくいきません。
2)php.ini の変更
# vi /etc/php.ini
;default_charset = "UTF-8"
を
default_charset = ""
に変更
動作結果:NG
そもそも php 使ってませんし。
ここでブラウザ側のレスポンスヘッダを確認してみますと utf-8 となっていました。
んー?なのに文字化け?理解できないぞ・・・
ちなみに、cgi のソースや HTML, CSS, JS, テンプレートファイルなど、すべてのファイルは UTF-8 で記述してます。(改行は LF)
なぜだろう、と、試験を実施することに。
3)簡単なHTMLを用意
[test.html]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>テストページ</title>
</head>
<body>
UTF-8で記述されたページ
</body>
</html>
動作結果:なんと、うまく表示されます。
4)cgi だとダメなのかな?
[test.cgi]
#!/usr/bin/perl --
print "Content-Type: text/html; charset=utf-8\n\n";
print "<html><body><div>\n";
print 'クオート文字';
print '<br>';
print "ダブルクオート文字";
print '<br>';
print "<div></body></html>\n";
exit;
クオートとダブルクオートで分けたのは、 perl の動作で文字化けしているのかどうかを確認するためです。動作結果:なんと、うまく表示されます。
5)HTML::Template が怪しい。
どうやら使用している HTML::Template が怪しいのではないかとあたりを付けて検索したら情報がありました。
HTML::Template 2.98 で UTF問題が解決してる!というのです。
移行先のサーバーの HTML::Template は Ver,2.97 です。
ちなみにうまくいっていた旧サーバーの HTML::Template は Ver,2.94 でした。
Ver 2.98 のソースはここにありました。
https://github.com/mpeters/html-template
CPAN からのインストールしかやったことないので、git からどうやってインストールするのかわからずw
ダウンロードした HTML/Template.pm, HTML/Template/FAQ.pm をそのまま perl5 のファイルに上書きw
文字化けする cgi を動作させてみました。
動作結果:NG
ここまで、大量に時間を食ったにもかかわらず、うまくいかないとは・・・
6)binmode => 'utf8' を記述
既存 cgi の new HTML::Template 構文で、binmode => 'utf8' を追加する、との記述があったので
試してみました。
動作結果:NG
この記述は、上記リンクをたどる際に対応したパッチを当てたソースの場合に有効だったもので、動かないことは予想できていました。
7)utf8 => 1 を記述
HTML/Template のドキュメントを読み、new 構文の utf8 オプションがあることを発見。(旧サーバにはないオプションでした。)
既存 cgi の new HTML::Template 構文で、utf8 => 1 オプションを追加して実行してみました。
my $tmpl = HTML::Template->new(die_on_bad_params => 0, filename => $file, utf8 => 1);
動作結果:おお!!!!ようやく文字化けせずに表示されました!
しかしながら、問題があります。
既存プログラムの cgi ファイルは山のようにあります。
その全部にフラグを追加するのは困難ですよ。
デグレードなんか発生させちゃった日にゃ目も当てられません。
なんとかならないかな・・・
8)HTML::Template を編集。
perl5 の HTML/Template.pm を開いてみると、次のような部分なありました。
my %OPTIONS;
BEGIN {
%OPTIONS = (
debug => 0,
;
utf8 => 0,
;
ええい、こいつを1にしてしまえ!
utf8 => 1,
と変更した後で、既存の cgi に戻して動作動作結果:OK
文字化けが解消されました!!!
モジュールの挙動が変わるなんて、ほんと困りものです。