日本語コードコンバータ

                             ack Version 1.39
                                                           小笠原博之 (COR.)

  漢字コードコンバータです。日本語 EUC、シフトJIS、7bit JIS のそれぞれのコー
ド系に相互変換を行うことができます。JIS 片仮名 (SJIS 半角仮名) の変換に対応し
ています。入力漢字コードは自動判別することが可能で、これら片仮名が含まれてい
ても混乱しません。またファイルの日本語コードを置換する、という使い方もできま
す。開発は SunOS4, NEWS-OS4, Human68k 上で行いました。


●install 方法

  まず Makefile を参照し、必要なら手を加えて下さい。特に CFLAGS の設定によっ
て、デフォルトの出力漢字コードを以下のように設定することができます。

        -DDEFCODE=0     デフォルトの出力漢字コードは 7bit JIS
        -DDEFCODE=1     デフォルトの出力漢字コードは 日本語 EUC (EUC)
        -DDEFCODE=2     デフォルトの出力漢字コードは シフトJIS (SJIS)

さらに 7bit JIS での出力コードの組み合わせの標準値を -DDEFJIS=n で与えること
ができます。(-j オプションの説明参照) 他のコンパイルスイッチは修正しなくても
使えます。(スイッチの詳細は次に説明します)

  その他 install 先のパスに修正など加えたら、make および make install して下
さい。



●コンパイルスイッチについて

        DEFCODE=n       デフォルト出力漢字コード指定(n=0:7bitJIS,1:EUC,2:SJIS)
        DEFJIS=n        出力 7bit JISコードの組合せのデフォルト

    以下、-DXXXX=1 で on、-DXXXX=0 で off となります。

        SHORTNAME       X68K の Human68k 等、ファイル名に許されるピリオドが1
                        つでかつ拡張子は3文字以内しか使えないという場合に指定
                        します。TwentyOne.x でマルチピリオド状態にして使って
                        る時は不要。

        LANGCHK         環境変数 LANG の値から、出力漢字コードを自動判定しま
                        す。(NEWS-OS 等、Ja_JP.SJIS の後ろの部分を参照する)

        NEWSAUTO        NEWS-OS の tty の system 漢字コードから出力漢字コード
                        を自動判定します。

        ENVACK          環境変数 ACK を参照します。ACK の設定内容は、一番最初
                        にオプションスイッチとして読み出されます。例えば変数
                        ACK に -s, -e, -j 等を設定しておくことで、デフォルト
                        出力コードを利用者が設定しておくことができます。
                        「例 export ACK=-st など」スイッチ文字列は1つしか書
                        けません。

        JCONVSW         漢字コードのスイッチ指定に jconv と同じ記述方法
                        「-{inputcode}{outputcode}」が使えるようになります。
                        例えば -Se の代わりに -se と書くことができます。(最
                        初に書いた方が入力コード)



●使い方

        ack [-{e|s|j[n]|c[c]}] [-{a|A|o<file>}] [-zuCnt] [-{E|S}] [<file>..]

  指定したファイルの漢字コードを変換します。出力コード系は -e, -s, -j の 3種
類から選ぶことができます。それぞれ日本語 EUC, シフトJIS, 7bit JIS です。-c
の場合は変換出力せず、入力コードのチェックを行ないその結果のみ表示します。入
力ファイルは複数記述可能です。省略した場合は標準入力から読み込みます。

  出力先は以下の4種類の選択ができます。(標準入力から読み込む場合は最初の2つ
のみ有効)

   ・何も指定しない場合 標準出力に書き出す
   ・ -o <file>         指示したファイルに格納する
   ・ -a                元ファイルに出力漢字コード名を付加したものに書き出す
   ・ -A                元ファイルそのものを置き換える

  例えば、aish.doc の漢字コードを EUC にしたければ次のようになります。

        ack -e aish.doc                 -> 画面に表示する
        ack -e -o euc.txt aish.doc      -> euc.txt に出力する
        ack -ae aish.doc                -> aish.doc.euc に出力する
        ack -Ae aish.doc                -> aish.doc を euc コードで置き換える
                                           (元ファイルは aish.doc.bak となる)

  出力漢字コードを指定しなかった場合は、コンパイル時に指定したデフォルト漢字
コードが用いられます。



●オプションスイッチの詳しい説明

        -e      出力漢字コードを 日本語 EUC にします。

        -s      出力漢字コードを シフトJIS にします。

        -j[n]   出力漢字コードを 7bit JIS にします。n は出力コードのモードで
                す。省略して -j とした場合は、n の値はコンパイルスイッチ
                -DDEFJIS で与えたものになります。n の数値の意味は以下の通り。

                                0      1
                        bit0: ESC$B  ESC$@      JISX208-1983,1978切替え
                        bit1: ESC(J  ESC(B      JISX201ローマ字,ASCII切替え
                        bit2: ESC(I  SI/SO      JISX201片仮名の指示方法切替え
                        bit3: ESC$x  ESC$(x     ( を省略する、しない切替え

                <例>    -j0 : ESC(J, ESC$B, ESC(I
                        -j1 : ESC(J, ESC$@, ESC(I
                        -j2 : ESC(B, ESC$B, ESC(I
                        -j3 : ESC(B, ESC$@, ESC(I

        -c      変換出力をせずに、入力コードの判定のみ行ないます。判定結果の
                コードタイプと、それぞれの文字数を表示します。漢字 (kanji,
                kanji7, err) は 2byte で1文字として数えています。

                        code    :コードタイプ ascii,sjis,euc,jis の4種類
                        kanji   :sjis,euc 漢字の文字数
                        kana    :sjis,euc 片仮名文字数(SJIS半角仮名)
                        kanji7  :7bit jis 漢字の文字数(2byte code)
                        kana7   :7bit jis 片仮名の文字数(1byte code)
                        err     :sjis,euc 漢字で判定不能文字の文字数
                        ascii   :7bit 表示可能(図形)文字(0x20〜0x7e)文字数
                        ctrl    :コントロールコードの文字数(改行,TAB含む)
                        other   :その他の文字数

        -cc     入力コードのコードタイプのみ表示します

        -z      入力に JISX201 片仮名文字が含まれていれば、それを JISX208 の
                片仮名に置き換えます。(いわゆる半角仮名->全角仮名変換)

        -a      出力ファイル名を自動で割り当てます。出力コードに応じて、入力
                ファイル名に .jis/.euc/.sjis を追加した名前になります。(すで
                についていた .jis/.euc/.sjis/.ujis は削除する)

        -A      ファイル内容をコード変換して置き換えます。元ファイルは .bak
                をつけた名前で保存します。

        -t      タイムスタンプを保存します。出力ファイルのタイムスタンプを、
                入力ファイルと同一にします。標準出力の時は意味を持ちません。

        -o file 出力ファイル名を指定します。入力ファイル名より先にないと有効
                になりません。(入力ファイルが複数ある時は、このスイッチは直後
                に指定したものに対してのみ有効)

        -C      変換不能漢字コードを「※」に置き換えて出力します。このスイッ
                チがなければエラー文字は何の変換も無しにそのまま出力します。

        -n      入力漢字コード判定時に、ファイル名の .jis/.euc/.sjis/.ujis
                を参照しません。

        -u      入力の 0x0d および 0x1a を取り除きます。UNIX モードです。
                DOS -> UNIX のテキスト変換時に使用できます。(注意:暫定機能)

        -d      入力ファイルがディレクトリであっても無視しません。通常は、ディ
                レクトリ名が与えられた時は無視します。

        -E      入力コード自動判定を使わず、常に入力漢字コードを日本語 EUC ま
                たは 7bit JIS として扱います。

        -S      入力コード自動判定を使わず、常に入力漢字コードを シフトJIS ま
                たは 7bit JIS として扱います。



●入力漢字コードの判定について

  ack は最初に入力漢字コードを判定します。入力コード系は日本語 EUC, シフトJIS,
 7bit JIS の3種類ありますが、7bit JIS コードは 8bit 系の EUC や シフトJIS と
共存できるため、実際の判定は EUC か シフトJIS かだけが行われています。つまり
 7bit JIS コードは判定結果にかかわらず常に入力可能です。

  判定は以下の順に行います。よって最初のものほど優先して用いられます。

        1) コマンドラインからの入力コード指定, -E または -S

        2) 入力ファイル名による判定。ファイル名末尾の .jis/.euc/.sjis/.ujis
           から漢字コードを判定する。-n スイッチがある場合はこの判定は行いま
           せん。

        3) データをある一定量先読みし、EUC と シフトJIS で評価を行い評価ポイ
           ントの高い方の漢字コードを採用する。(SJIS半角仮名のみのファイルで
           あってもほぼ間違えずに SJIS, EUC を見分けることができる)



●出力漢字コードの自動判定について

  出力漢字コードの自動判定は、コンパイルスイッチによって指定できます。優先順
位は番号順です。

        1) コマンドラインからの出力コード指定, -j, -e, -s

        2) 環境変数 ACK からの判定。これはコンパイル時にスイッチ -DENVACK を
           1 にした場合のみ有効です。環境変数 ACK の内容をコマンドラインスイッ
           チとして解釈します。
                -j      => 7bit JIS
                -e      => EUC
                -s      => SJIS

        3) 環境変数 LANG からの判定。これはコンパイル時にスイッチ -DLANGCHK
           を 1 にすると有効になります。環境変数 LANG の内容によって出力コー
           ドを判定します。(NEWS-OS 等)
                ja*.EUC         => EUC
                ja*.SJIS        => SJIS

        4) tty モードからの判定。コンパイルスイッチの -DNEWSAUTO を 1 にして
           おくと有効になります。場合どの漢字コードの変換すべきかを system
           漢字コードから判断します。(NEWS-OSのみ)

        5) コンパイルスイッチの DEFCODE で指定されたコードを使用します。



●使い方の例

・nkf のような漢字変換プログラムとして使う例

        ack -s file             file を SJIS に変換表示


・JISX201片仮名 -> JISX208片仮名 (半角仮名 -> 全角変換) プログラムの例

        ack -ze  file           変換して EUC で出力


・漢字コードチェッカとして使う例

        ack -c  file            file のコードタイプとそれぞれの文字数表示


・ファイルの日本語コードコンバータの例

        ack -as file1.euc file2.jis

                                file1.euc, file2.jis をそれぞれ SJIS に変換し
                                file1.sjis, file2.sjis に格納する。

        ack -Ate file1 file2
                                file1 と file2 を EUC に変換して置き換える。
                                元のファイルは file1.bak と file2.bak に保存
                                される。このときタイムスタンプも保存する。



●入力コードチェック表示 -c の補足説明

  err は、漢字など 2byte 文字の判定で失敗した場合に加算されます。1byte の表示
不可能文字は other です。改行、タブ、エスケープ、SI/SO 等も ctrl に入ります。
入力が euc と判定された場合は、ctrl の範囲に 0x80〜0x9f, 0xff も含まれます。
(ただし 0x8e は仮名文字の一部とみなす)

  ファイルサイズと文字数との関係式は以下の通り

    sjis のみの場合

        kanji*2 + kana + err*2 + ascii + ctrl + other = ファイルサイズ

    euc のみの場合

        kanji*2 + kana*2 + err*2 + ascii + ctrl + other = ファイルサイズ

これに jis7 文字が含まれる場合は「kanji7*2 + kana7 + α」が加わります。

  コードタイプの表示は次のように処理しています。

        kanji または kana が 0 でないとき               sjis or euc
        kanji,kana が 0 で kanji7,kana7 が 0 でない時   jis
        kanji,kana,kanji7,kana7 が全部 0 のとき         ascii

  err が大量に加算されている場合は、入力はまずバイナリデータだと思って間違い
ありません。

  なお、Human68k で動かす場合は、改行コードが 2byte でも ctrl が 1 しか加算さ
れないため、jis7 が含まれていなくてもファイルサイズとの差が生じます。この差は
行数に相当します。



●注意点

  入出力は常にバッファリングされます。特に入力コードを自動判定する時は大量に
先読みします。

  使用できるコードは、ネットニュースやパソコン通信等で主に使われているものに
限定されています。例えば補助漢字とか文字セットの複雑な呼び出しや指示といった
ものの複雑なシーケンスには対応していません。

  機種依存文字の変換には全く関与していません。このような機種依存文字は、変換
エラー文字と扱われる場合があります。

  EUC か SJIS かのコード系判定は、ファイル毎の変換の最初にのみ行います。先読
みバッファは多目に設定してありますが、もしバッファ内にコード判定できる要素が
なければ自動判定はうまくいかないことがあります。

  作りたてなので実は動作チェックがあまり行なわれていません。

  エラーチェックがまだまだ完全ではありません。(と思う)



●最後に

  動作確認を行ってくれた山形大学でんでんネットのアクティブチャットメンバー
(主に東北大学の方)に感謝します。またさまざまなアドバイスやバグ報告してくれた
方々に感謝します。マニュアル ack.1 は きだ@コニカ さんに作成していただきま
した。



●連絡先

小笠原博之 (Ogasawara Hiroyuki)
  InterNet: oga@dgw.yz.yamagata-u.ac.jp
DenDen-NET: DEN0006 COR. (0238-21-5952/133.24.72.9)