nkfを使ったネットワークフィルタ(漢字コードについて)


電子メールへの送信時に漢字コード変換する場合

電子メールはJIS(7ビットJIS)コードを使うことが慣例(なのか常識なのか?)です。 CGIプログラムなどで変換して送信するわけですが、 perlはCなどのプログラムと比較すると処理が遅いものです。 特に、漢字コード変換などは、主にjcode.plで処理されますが、 ちょっとした文字列の変換には便利ですが、電子メールなど、 データすべてをJISに変換するなど、効率が悪い場合もあります。 そういう場合は、パイプを使って、メール送信する前に、 外部プログラムに漢字変換を任せてしまう方法が有効です。 電子メール試験用CGIプログラムもあります。

jcode.plを使った例

require 'jcode.pl';
open(OUT,"| /usr/lib/sendmail -t");
print OUT "To: 配信先Eメール\n";
print OUT "From: 送信元Eメール\n";
print OUT &jis("Subject: メールのタイトル\n"); #全角文字を送信する場合はJISに変換する
print OUT "Content-Transfer-Encoding: 7bit\n";
print OUT "Content-Type: text/plain; charset=iso-2022-jp\n";
print OUT "\n";
print OUT &jis("メールの内容A\n");
print OUT &jis("メールの内容B\n");
close(OUT);
sub jis { $msg = $_[0]; &jcode'convert(*msg, 'jis'); return $msg; }

nkfを使った例

これはperlだけ(jcode.pl利用)で漢字変換をして電子メール(sendmail利用)する ルーチンですが、これをnkfに漢字変換を任せるようにするには、次のようにします。

open(OUT,"| /usr/local/bin/nkf -j | /usr/lib/sendmail -t");
print OUT "To: 配信先Eメール\n";
print OUT "From: 送信元Eメール\n";
print OUT "Subject: メールのタイトル\n";
print OUT "Content-Transfer-Encoding: 7bit\n";
print OUT "Content-Type: text/plain; charset=iso-2022-jp\n";
print OUT "\n";
print OUT "メールの内容A\n";
print OUT "メールの内容B\n";
close(OUT);


SSI実行結果を漢字コード変換する場合

UNIXでの漢字コードはEUCを使うのが多く、パソコン(特にWINDOWS)ではSJISを 使うことが多いために問題が生じるということです。これはSSIでの話です。 例えば、アクセスカウンタの場合は数字をHTMLに張り付けるわけですから問題ないのですが、 漢字を入れたい場合は漢字コードの変換が必要です。例えば・・・

  test.csh

    #!/bin/csh
    set kazu="キムタク"  <-これはパソコンで書いたのでSJISだ!
    echo $kazu

  test.html

    以上略
    みなさん、私は<!--#exec cmd="./test.csh"-->です。<p>
    以下略

  これだと、SSI埋めこみの前後はSJISで『キムタク』がEUCだったりします。
  そこで漢字コード変換プログラムであるフリーソフトのnkfを利用します。

    みなさん、私は<!--#exec cmd="./test.csh | /usr/local/bin/nkf -s"-->です。<p>

    -s でSJISを出力させる。入力コードは自動判別してくれる。


nkf(v1.6)をインストールする

nkfはプロバイダで用意されている場合もありますので、まず聞いてみてください。 もし存在しなければ自分でサーバにインストールする必要があります。 当然、シェルモードが使えなければできません。

旧バージョンのnkfをインストールする

上記ではv1.6をご紹介しましたが、資料として、いままで当サイトで使っていた旧バージョンも記録に残しておきます。 当サイトで単に漢字コード変換しているだけの機能には、こちらでも全く問題ありません。

  1. nkfのソース(C言語でかかれたプログラム)をダウンロードします。
    nkfの説明書はここにあります。

  2. それをあなたのディレクトリ(どこでもいいが、私はホームページを置いてあるpublic_htmlという ディレクトリ下にbinという名前のサブディレクトリを作って置いています)にFTPでアスキーモードで 転送します。私の環境(Windowsからリムへ)の場合、FTPをバイナリ転送すると^Mコードが改行の 場所に入ってしまいコンパイルできませんでした。

  3. パソコン通信でリムに入りシェルモードにします。転送した場所までディレクトリを移動したあと、 コンパイルします。ccでなくてgccでもコンパイルできます。

    %cc nkf.c -o nkf         (nkf.cをコンパイルし、nkfという名のオブジェクトを作成する。)
    
    コンパイルが成功すれば、特になにも表示せず%プロンプトが出ます。作成したnkfのオブジェクトの
    パーミッションは755になっていると思いますが、確認します。
    
    %ls -l nkf               (-rwxr-xr-xならOKです。もし違っていたらchmodします。)
    %rm nkf.c                (必要なくなったソースを削除します。)
    
  4. ccやgccの場所はプロバイダに聞くこと。