そりゃもちろん、文字化けをなくすため。
変換には(たぶん)「Jcode.pm」を使っている。「htmllint.cgi」で使っていたので、それを参考にしてなんとかできた。意味不明な命令がいくつかあったけど、なんとなく使い方はわかった気がする。説明書を読んだらもっと簡単にわかるのかもしれないけど・・・。
出力は「JIS」にしてみた。「JIS」はブラウザでは文字化けが起きにくいらしいから。Windowsでは「Shift_JIS」、perlでは「EUC」、そしてブラウザでは「JIS」・・・。それぞれ得意分野が違うのは仕方のない事なのかな?
ちなみに、「Jcode.pm」では「Unicode(UTF-8)」も変換に使えるらしい。試してみるのも悪くない。
「Jcode.pm」は「htmllint」を使うためにインストールしたから、使うのは簡単。「require Jcode;」これだけ。あとは、コードを取得する「getcode」と、変換する「convert」の2つ。これらは「*Jgetcode = \&Jcode::getcode;」「*Jconvert = \&Jcode::convert;」と書くことで、「Jgetcode」「Jconvert」という名前でサブルーチンとして使えるようになる(ような気がした)。
「getcode」は、引数に対象となる文字列を渡すと、その文字の漢字コードを返してくれる。「convert」は「変換する文字列、変換目的のコード、変換前のコード」の3つを引数として渡すと、コードが変換されて返ってくる。漢字コードの指定は「utf8」「jis」「euc」「sjis」というふうに指定する。「getcode」でもこれらの文字列が返ってくる。なかなか便利だ。
・・・
今回、ローカル環境から完全に移行するために「jcode.pl」に変更しました。よって「Unicode(UTF-8)」は使えなくなってます。
ソースコード
#!/usr/bin/perl
# require Jcode;
# *Jgetcode = \&Jcode::getcode;
# *Jconvert = \&Jcode::convert;
require "../../../cgi-bin/jcode.pl";
*Jgetcode = \&jcode::getcode;
*Jconvert = sub { &jcode::to($_[1], $_[0], $_[2]); };
@styles = ("../../ipp.css","../test.css");
$title = "テスト10";
$mycode = &Jgetcode(\$title);
$cutcode = "jis";
$scrname = "";
$filename = "";
$rtdir = "../";
$file = "";
{
$scrname = $ENV{'SCRIPT_NAME'};
$scrname =~ s/_1|_u// ;
if($scrname =~ /(ts[0-9]{4}\.cgi$)/){
$filename = $+ ;
$filename =~ s/cgi/htm/ ;
}
&printHeader;
print "<div class=test>\n";
&Jprint ("$mycode → $cutcode 変換<br>\n");
&Jprint ("「親ディレクトリ」には、以下のHTMファイルがあります。");
print "<ul>\n";
chdir($rtdir);
opendir(DIR, ".");
while ($file = readdir(DIR)) {
if($file =~ /htm$/){
open(IN, $file);
while(<IN>){
if(/<title>/){
if($' =~ /<\/title>/){
print "<li>$file" ;
&Jconv ("(", $`, ")", "\n");
last;
}
}
}
close(IN);
}
}
closedir(DIR);
print "</ul>\n";
print "</div>";
&printFooter;
exit;
}
sub printHeader{
print "Content-type: text/html\n\n";
&Jprint ("<html lang=ja><head><title>", $title, "</title>", "\n");
foreach $st (@styles){
print "<link rel=\"stylesheet\" type=\"text/css\" href=\"$st\">\n";
}
print "</head><body>\n";
print "<div class=head>\n";
&Jprint ("<h1>", $title, "</h1><hr>\n");
&printlinks;
print "<hr></div>\n";
}
sub printFooter{
print "<div class=foot><hr>\n";
&printlinks;
print "<hr>\n";
open(IN, "../../sig.txt");
while ($sig = <IN>){ print $sig; }
close(IN);
print "</div>\n";
print "</body></html>\n";
}
sub printlinks{
print "<a href=\"../../../index.htm\">Home</a>\n";
print "/\n<a href=\"../../\">Perl</a>\n";
print "/\n<a href=\"../\">TestCGI Index</a>\n";
if($filename){
&Jprint ("/\n<a href=\"../$filename\">", $title, "の解説", "</a>\n");
}
}
sub Jprint{
foreach (@_) { print &Jconvert($_, $cutcode, $mycode); }
}
sub Jconv{
foreach (@_) { print &Jconvert($_, $cutcode, &Jgetcode($_)); }
}
