「Unicode」でスクリプトを実行してみたかった。それだけ。変換には少し時間が掛かるようだ。原因はファイルの入出力にあるのか、それとも、変換にあるのか・・・。ともかく、実行はできるようなので少し試してみよう。そんなわけで、今までのサンプルを「Unicode」に変換してみました。
実行してみると、色々不具合がありますね・・・。そもそも、ファイル名を限定しすぎていたから、「…の解説」に戻れなくなった。しかも、出力が標準で「Unicode」になるから、NNではまともに見れないです。
今回は色々と見なおしてみた。じっくり見ていくともっと工夫できそうな事もあって、なかなか迷ってしまう。
ブラウザへの出力「Content-type: text/html」に「charset=ISO-2022-JP」とかを付け加えて書くと、ブラウザはきっちり理解してくれるようだ。試しに出力を「Unicode」にして書いてみると、今までは「日本語(自動選択)」のままだったのがちゃんと「ユニバーサル文字(UTF-8)」で表示された。NN4は相変わらず「□」に化けてるけど・・・。NN3はオプションなのか、グレー表示になっていた。「Unicode」はブラウザへ出力するのはやめたほうがいい。「Unicode」を乱用するのは、文字化けの原因を増やす事になるだけのような気がする。
グローバル変数とローカル変数を区別しやすくするために、グローバルな変数は「$G_」ではじめる事にした。区別するのには、一般的には大文字を使うことが多い(環境変数も大文字だし)みたいだけど。小指が痛くて「Shiftキー」を長い時間押しているのは疲れるし、「CapsLock」もあまり使いたくない。基本的に大文字が好きじゃないという事もあるけど。
少し前に気づいたけど、正規表現で「何回繰り返す」の表現は、その後ろに「{}(中カッコ)」で囲んだ数値をいれると良いようだ。その他にも、無くてもいい(0文字以上)なら後ろに「*」を、1文字以上なら後ろに「+」を表記する。つまり、「ts[0-9][0-9][0-9][0-9]」は「ts[0-9]{4}」と書けるし、桁数にこだわらないなら「ts[0-9]*」一桁以上なら「ts[0-9]+」と書く。なかなか便利だ。
「.(ピリオド)」のエスケープは常にするように心がけた方が良いのかな?「.」は正規表現内では特殊文字なのでエスケープが必要なのに・・・。「"…"」では「\」は常にエスケープされるから、「\\」以外に「\」を表現する方法は無いけど・・・。時々は変数を出力してみて、感覚をつかむ必要がありそうだ。いい例が「"index\\.($HTMLEXT)"」だ。読み方には気をつけよう。
「HTML-Lint」で書かれている出力する漢字コードの格納先は、今まで「$cutcode」だと思っていた。でも、実は「$outcode」と書いてあった。確かに・・・。意味もわからずにまねをするのは恥ずかしい事だな・・・と思った。他にも、変数の書き方の規則(とまではいかないけど)を考えて変更したり、ループや関数の書き方をなるべく統一したりした。
・・・
今回、ローカル環境から完全に移行するために「jcode.pl」に変更しました。よって「Unicode(UTF-8)」は使えなくなってます。
というわけで、「euc」で出力してます。・・・このテストの意味がほとんど無くなりました (^^;;;
ソースコード
#!/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]); };
@G_styles = ("../../ipp.css","../test.css");
$G_title = "テスト15";
$G_myCode = &Jgetcode("漢字");
$G_Code = "jis";
$G_Charset = "ISO-2022-JP";
$G_scrName = $ENV{'SCRIPT_NAME'};
if($G_scrName =~ /ts[0-9]{4}/){
$G_scrName = $&;
$G_linkFile = "../$G_scrName.htm";
}
# 固有設定
$G_inFile = "ts0014.cgi";
# $G_outCode = "utf8";
$G_outCode = "euc";
$G_outFile = $G_inFile;
# $G_outFile =~ s/\.cgi/\_u\.txt/;
$G_outFile =~ s/\.cgi/\_e\.txt/;
{
&printHeader;
print "<div class=test>\n";
&fileOUT ($G_outFile, &fileIN($G_inFile));
&Jprint ("<a href=\"$G_outFile\">出力が完了しました。</a>\n");
print "</div>\n";
&printFooter;
exit;
}
sub fileOUT{
local($outFile)= shift(@_);
local(@outFileLines) = @_;
&Jprint ("出力ファイル名 : ");
print $outFile;
print "<br>\n";
# &printSource(@_);
open (OUT, "> $outFile");
foreach (@outFileLines){ print OUT &Jconvert($_, $G_outCode, &Jgetcode($_)); }
close (OUT);
# &Jprint ("以上の内容で出力しました。");
}
sub fileIN{
local(@inFileLines);
local($inFile) = $_[0];
&Jprint ("入力ファイル名 : ");
print $inFile;
print "<br>\n";
open (IN, $inFile);
@inFileLines = <IN>;
close (IN);
return @inFileLines;
}
sub printSource{
local(@lines)= @_;
local($line);
print "<ol>\n";
foreach $line (@lines){
$line =~ s/&/&/g;
$line =~ s/"/"/g;
$line =~ s/</</g;
$line =~ s/>/>/g;
$line =~ s/ / /g;
print &JconvPrint("<li><code>$line</code>");
}
print "</ol>\n";
}
sub printHeader{
if($G_Charset){
print "Content-type: text/html; charset=$G_Charset\n\n";
}else{
print "Content-type: text/html\n\n";
}
print "<!doctype html public \"-//W3C//DTD HTML 4.0 Transitional//EN\">"."\n";
print "<html lang=ja>\n<head>\n";
if($G_Charset){ print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=$G_Charset\">\n"; }
&Jprint ("<title>$G_title</title>\n");
foreach (@G_styles){ print "<link rel=\"stylesheet\" type=\"text/css\" href=\"$_\">\n"; }
print "</head>\n<body>\n";
print "<div class=head>\n";
&Jprint ("<h1>$G_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 (<IN>) { print; }
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($G_linkFile){ &Jprint ("/\n<a href=\"$G_linkFile\">$G_titleの解説</a>\n"); }
}
sub Jprint{
foreach (@_){ print &Jconvert($_, $G_Code, $G_myCode); }
}
sub JconvPrint{
foreach (@_){ print &Jconvert($_, $G_Code, &Jgetcode($_)); }
}
