kcc -
自動判別機能つき漢字コード変換
kcc [
-IOchnvxz ] [
-b bufsize ] [
file ] ...
kcc は,指定した
file
を順番に読み込み,漢字コードを変換して標準出力に出力するフィルターです。
ファイルの指定がないとき,あるいはファイル名として
-
が指定されたときには標準入力から読み込みます。入出力の漢字コードはオプシ
ョンで指定しますが,入力コードを指定しないとファイルごとの自動判別になり
ます。
使える漢字コードは
JIS(7 ビットおよび 8
ビット),シフト
JIS,EUC,DEC です。
入力コードは,EUC,DEC
あるいはシフト
JIS
のいずれかと 7 ビット
JIS
との組み合せに限り,混在が可能です。JIS
の半角仮名は
SI/
SO,
ESC(I
ともに認識されます。
-
-O
-
-IO
-
I
で入力漢字コードを,O
で出力漢字コードを指定します。入力コードの指定がないときには自動判別に,
また,どちらも指定しないとき出力コードは
7 ビット JIS
になります。
- 入力コードを指定する
I は以下のうちの 1
つです。
- e
-
EUC(7 ビット
JIS 混在可)
- d
-
DEC(7 ビット
JIS 混在可)
- s
- シフト JIS(7
ビット JIS
混在可)
-
j,7 または
k
- 7 ビット JIS
- 8
- 8 ビット JIS
- 出力コードを指定する
O は以下のうちの 1
つです。
- e
- EUC
- d
- DEC
- s
- シフト JIS
-
jXY または
7 XY
- 7 ビット JIS(SI/SO
による JIS
仮名指示)
-
kXY
- 7 ビット JIS(ESC(I
による JIS
仮名指示)
-
8XY
- 8 ビット JIS
-
O 中の XY で,JIS
コード出力でのエスケープシークェンスが指定できます。省略
すると BJ
とみなされます。なお,補助漢字指定は
ESC$(D で固定です。
- X
- 漢字指定
- B
-
ESC$B(第 2
次規格漢字指示)
- @
-
ESC$@(第 1
次規格漢字指示)
- +
-
ESC&@ESC$B(第 3
次規格漢字指示)
- Y
- 英数字指定
- B
-
ESC(B(ASCII 指示)
- J
-
ESC(J(JIS
ローマ字指示)
- H
-
ESC(H(スウェーデン名前用文字指示)
- -v
- 入力コードの判別結果を標準エラー出力に出力します。
- -x
- 拡張モード。入力コードの自動判別で,外字や拡張文字領域(EUC
の外
字・未定義の半角仮名・制御文字
C1
の各領域,およびシフト
JIS
の拡張文字領域)を認識します。DEC
と EUC
との判別はこのモードでのみ,なされます。
- -z
- 縮小モード。入力コードの自動判別で半角仮名を認識しません(7
ビット JIS
を除く)。半角仮名を含まないファイルの場合,これを指定すると判別の確度が
高まります。
- -h
- 半角仮名を DEC
に変換すると全角のカタカナに変換されますが,このオプションを指定するとひ
らがなになります。
- -n
- 外字・拡張文字・補助漢字領域を“□”に,半角仮名の未定義領域を半角の
“・”に変換します。
-
-b bufsize
- 入力の判別がつかないあいだ入力をためておくバッファーの大きさを指定しま
す。省略時は 8k
バイトです。
- -c
- 変換を行わず,入力コードの種類だけを調べ,結果を標準出力に出力します。通
常の自動判別の場合とは異なり,ファイルは最後まで調べられます。ただし,途
中でコード体系に矛盾が見つかった場合には読み込みを中断し“data”と表示し
ます。 -x,-z
以外のオプションは無効になります。
-
% kcc -e file
- 入力コード自動判別で出力コードは
EUC
-
% kcc -sj file1 file2
- シフト JIS
のファイル 2 つを
JIS へ変換し連結
-
% command | kcc -k+J
-
command 出力を
JIS(JIS 第 3 次規格
漢字指示,JIS
ローマ字指示, ESC(I
による JIS
仮名指示)へ
-
% kcc -c file
-
file
のコードを判別する(変換は行わない)
入力コードの自動判別は通常の文書においてはほぼ確実に行えますが,以下のよ
うな問題を含んでいます。
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
コード出力の場合,改行・タブ・抹消などの制御文字や空白(半角)は,英数字
モードで出力されます。
入力コードの自動判別を誤った場合,また,それぞれの文字セットに未定義の文
字が入力された場合,出力がどうなるかは不定です。