漢字コードの変換

そりゃもちろん、文字化けをなくすため。

変換には(たぶん)「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)」は使えなくなっています。

ソースコード

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
#!/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/htmlnn";
    &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($_)); }
}
comments powered by Disqus
Hugo で構築されています。
テーマ StackJimmy によって設計されています。