どんな問題にも言えることですが,何か技術的な疑問があった場合は, できるだけ最小のもので再現できるように努力してください. それが問題への理解を深め,問題解決を早めます.
unshift しなければ utf-8で奇麗に出力されます 一度 @data に入れて printしたものを読み込むと 文字化けしてしまいます
ソースコードでの違いを見ます. 問題が何処で起きているかを確認するためです. 今回は,unshift があるところの差分で確認できそうです.
$ diff -w index{1,2}.cgi
44,45c46
< unshift @data,"$mytime','$name','$email','$subject','$comments\n";
< print @data;
---
> print FILE $mytime,",",$name,",",$email,",",$subject,",",$comments,"\n";
そもそも,print と print FILE という違いがあります.
typo と予想して FILE を追加します.
そもそも open で utf-8 としてファイルをロードしているのかどうかという話があります.
- http://perldoc.jp/docs/perl/5.8.1/perluniintro.pod
- perldoc PerlIO
- http://perldoc.jp/docs/perl/5.8.1/open.pod
質問者への前提知識で,
-
Windows の Perl
-
Perl 5.8.X らしいので,デフォルトの PerlIOレイヤは,Shift_JIS になっているのかもしれません. 明示的に PerlIO を指定するのに open プラグマを使います.
use open ':utf8'; use open ':std';
入出力の両方のopen に :utf8 レイヤを指定して, :std は標準入出力へも :utf8 を指定しています.
と思ったけど,うまくいかなかったので, use open ':utf8'; binmode(STDOUT, ':utf8'); のように STDOUT にのみ :utf8 フラグを付けてみた.
自分の環境だとbinmode の方で上手くいったように見える.
あと気になるところとして,
- 出力された HTML が lang=en になってる.
- が複数表示されるようになっている
- 前者の方だけ,'(シングルクォート)が入っている.(typo?)
とかがあります.