« サブディレクトリ内も一覧(その2) | メイン | フォームからの入力 »

漢字コードの変換(その2)

「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/&/&amp;/g;
        $line =~ s/"/&quot;/g;
        $line =~ s/</&lt;/g;
        $line =~ s/>/&gt;/g;
        $line =~ s/ /&nbsp;/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($_)); }
}

カテゴリ:

トラックバック

このエントリーのトラックバックURL:

同一カテゴリの最新記事

最近のエントリー

Amazon.co.jp

Creative Commons License
このブログは、次のライセンスで保護されています。 クリエイティブ・コモンズ・ライセンス.
Powered by
Movable Type 3.36
Amazon.co.jp