KCC(1) | General Commands Manual | KCC(1) |
kcc - 自動判別機能つき漢字コード変換
kcc [ -IOchnvxz ] [ -b bufsize ] [ file ] ...
kcc は,指定した file を順番に読み込み,漢字コードを変換して標準出力に出力するフィルターです。 ファイルの指定がないとき,あるいはファイル名として - が指定されたときには標準入力から読み込みます。入出力の漢字コードはオプシ ョンで指定しますが,入力コードを指定しないとファイルごとの自動判別になり ます。
使える漢字コードは JIS(7 ビットおよび 8 ビット),シフト JIS,EUC,DEC です。 入力コードは,EUC,DEC あるいはシフト JIS のいずれかと 7 ビット JIS との組み合せに限り,混在が可能です。JIS の半角仮名は SI/SO,ESC(I ともに認識されます。
入力コードの自動判別は通常の文書においてはほぼ確実に行えますが,以下のよ うな問題を含んでいます。
7 ビット JIS はエスケープシークェンスによるモード切り替えによっていて確実に判別されま す。EUC と DEC は根本的には同じものです(以下 EUC 系と呼ぶ)。一方,8 ビット JIS の半角仮名はシフト JIS の半角仮名と同じです(同シフト JIS 系)。ところが,共に 8 ビットコードである EUC 系とシフト JIS 系は,領域が広く重なっていて背反しています。つまり,コードの自動判定の問 題点はこの 2 つの判別にあります。
EUC 系/シフト JIS 系の判別は行単位で行い,「シフト JIS 系でない」あるいは「EUC 系でない」と分かった時点で確定とします。 どちらにも矛盾する行が最初に現れたときには“data”扱いになり,出力内容は 保証されません。
最初に 8 ビットの漢字コードが現れてから EUC 系/シフト JIS 系の判別がつくまでは,変換を保留し,入力をバッファーにためておきますが, これがいっぱいになると EUC 系であると決めつけて変換を強行します。根拠は以下のとおりです。通常の漢字 入りの文書は JIS 非漢字か JIS 第 1 水準の漢字をまず含んでいると考えられますが,シフト JIS の場合,これらの文字は一部を除いて EUC 系の領域とは重なっていないため,確実に判別されます。つまり,判別できない ときには EUC である可能性が高いわけです。
8 ビット JIS で,半角仮名が必ず偶数個連続して現れているときは,EUC の漢字であ ると誤認されてしまうので注意が必要です。
入力が半角仮名を含まないときには -z オプションの縮小モードを利用すると判別の確度が高まります。これは重なる領 域が JIS 第 2 水準漢字内に限定されるからです。
シフト JIS の拡張領域・EUC の外字領域・EUC の制御文字 C1 の領域・EUC の半角仮名の未定義領域は,自動判別の認識対象には入ら ないので,これらを含む入力では誤った判別がなされてしまいます。このときは -x オプションで拡張モードを指定するか,入力コードを明示的に指定してくださ い。
cat(1)
通常,外字・拡張文字・補助漢字領域はそれぞれの対応する領域に投影されま す。ただし,シフト JIS への変換で拡張文字領域からはみ出す文字は,16 進で FCFC になります。 EUC と DEC の制御文字領域 C1 は, JIS へ変換する場合はそのままですが,シフト JIS への場合には削除されます。また,半角仮名の未定義領域は,シフト JIS に変換すると,半角の“・”に置き換えられます。半角仮名を DEC に変換すると全角の仮名に変換されます。
JIS コード出力の場合,改行・タブ・抹消などの制御文字や空白(半角)は,英数字 モードで出力されます。
入力コードの自動判別を誤った場合,また,それぞれの文字セットに未定義の文 字が入力された場合,出力がどうなるかは不定です。
1992年11月19日 | Y. Tonooka |