************************************************ libkcc README ************************************************ 1999-04-20 これは、kcc-2.3 を、lib 化したものです。 ライセンスは、元の kcc-2.3 が GPL2 ですので、それに従います。 まだ kcc の全ての引数は使用できませんが、ま、とりあえずバージョンということで。 -------------------------- 1. 使いかた(関数の説明) -------------------------- 漢字コード判定を行う関数と、漢字変換を行う関数の二つを用意しました。 コード判定: unsigned KCC_check(char *s, int extend); 変換: KCC_filter() int KCC_filter(char *ddd, char *outcode_name, char *sss, char *incode_name, int extend, int zenkaku, int gaiji); -------------------------- 1-1. コード判定関数 -------------------------- unsigned KCC_check(char *s, int extend); コードを調べたい 文字列(char * 型)を 第1引数に与えると、コードが返ります code = KCC_check(s,0); 第二引数の `int extend' は、 0 か 1 です。普通、0 を与えておけばよいです 1 : オリジナルの kcc -x と同様の動きをするはず 0 : 通常はこちらを指定しておけばよいでしょう 返される値は、次のようになっています -------------------------- 1-2. コードの番号 -------------------------- #define BINARY 0x100 #define ASCII 0x00 #define NONASCII 0x01 /* non-ASCII character */ #define JIS 0x02 /* JIS */ #define ESCI 0x04 /* "ESC(I" */ #define ASSUME 0x08 /* assumed EUC (or DEC) */ #define EUC 0x10 #define DEC 0x20 #define SJIS 0x40 #define JIS8 0x80 /* 8-bit JIS */ #define BIT8 (EUC | DEC | SJIS | JIS8) -------------------------- 1-3. 漢字変換関数 -------------------------- int KCC_filter(char *ddd, char *outcode_name, char *sss, char *incode_name , int extend, int zenkaku, int gaiji); 変換したい文字列 (char *) 型 を sss 変換後の文字列 (char *) 型 を ddd とします。 返り値は漢字コード(1-2) が返りますが、 失敗すると -1 が返ります。 0 が返る場合は ASCII だという事に注意してください。 例: i = KCC_filter(d, "EUC", s, "AUTO", 0,0,0); !注意: ddd は変換文字を納めるに充分な領域があらかじめとっていなければなりません。 この関数は、strcpy みたいなもので、sss を変換したものを、ddd のオーバーフローを チェックする事無く、 ddd に順次コピーしていくのです! outcode_name, incode_name は、漢字のコードの指定です。 outcode_name: 出力コードを指定 incode_name: 入力コードを指定 コードは、以下の "文字" で、指定します。 漢字コード: 文字: 説明 ----------------------------------------------------------------- EUC "EUC" euc SJIS "SJIS" sjis JIS 8bit "JIS8" 8 bit JIS JIS "JIS" jis JIS ESCI "JISI" jis で、ESC(I を使用しているもの 自動判別 "AUTO" incode_name にのみ有効。コードを自動判別する JIS, JISI, JIS8 だけは、次の特別な指定を行う事ができます。 これは、outcode_name にのみ有効なオプションで、 オリジナルの kcc の kcc -j[B@+][BJH] 指定と同じになります JIS[B@+][BJH] JISI[B@+][BJH] JIS8[B@+][BJH] 第一 B: 第1次漢字表示 @: 第2次漢字表示 +: 第3次漢字表示 第二 B: 英数は ASCII 指定 J: 英数は JIS ローマ字指定 H: 英数は スウェーデン ----------------------------------------------------------------- 第5引数の `int extend' は、 0 か 1 です。普通、0 を与えておけばよいです 1 : オリジナルの kcc -x と同様の動きをするはず 0 : 通常はこちらを指定しておけばよいでしょう 第6引数の `int zenkaku' は、 0 か 1 です。普通、0 を与えておけばよいです 1 : オリジナルの kcc -z と同様の動きをするはず 0 : 通常はこちらを指定しておけばよいでしょう 第7引数の `int gaiji' は、 0 か 1 です。普通、0 を与えておけばよいです 1 : オリジナルの kcc -n と同様の動きをするはず 0 : 通常はこちらを指定しておけばよいでしょう -------------------------- 2. Make -------------------------- edit Makefile shell> make shell> ls libkcc.a -------------------------- 3. インストール -------------------------- shell> make install インストールされるのは、libkcc.a と kcc.h だけです -------------------------- 4. TODO -------------------------- 1. gcc -Wall でいっぱいウォーニング 2. オリジナルの kcc.c を複数のファイルにわけたのは、私の趣味ですが、 おかげで、関数の引数が多くなってしまいました。 遅くなる? 3. 渡された文字列の処理がちょっとやぼったいです。 危険な部分があるかもしれません。(euc.c,jis.c,sjis.c,dec.c) 4. 半角文字を全角にしたいけど... 5. たぶんあるだろう bug fix 以上、どなたか達者な方、よろしく。 -------------------------- 5. 例 -------------------------- test.c, test_check.c, test_filter.c があります make test make test_filer make test_check -------------------------- -------------------------- takeshi@SoftAgency.co.jp http://www.softagency.co.jp/mysql/ ************************************************ オリジナルの README ************************************************ kccは,自動判別機能つき漢字コードフィルターです。 【説明】 日本語EUC,7ビットJIS,8ビットJIS,シフトJISが扱えます。 「半角かな」にも対応しています。 詳しくは日本語オンラインマニュアルで見て下さい。 【インストール】 $ make install で,makeとインストールが行われます。 $ make install.man で,日本語マニュアルのインストールが行われます。 日本語マニュアルのサブディレクトリーが‘japanese’でないときには, $ make JMANDIR=ja.JP_EUC install.man などとしてください。 ************************************************ オリジナルの kcc.jman を catman にしたもの ************************************************ KCC(L) KCC(L) 名名前前 kcc - 自動判別機能つき漢字コード変換 形形式式 kkcccc [ --_I_Occhhnnvvxxzz ] [ --bb _b_u_f_s_i_z_e ] [ _f_i_l_e ] ... 機機能能説説明明 kkcccc は,指定した _f_i_l_e を順番に読み込み,漢字コードを変換し て標準出力に出力するフィルターです。ファイルの指定がないと き, あるいはファイル名として -- が指定されたときには標準入 力から読み込みます。入出力の漢字コードはオプションで指定し ますが,入力コードを指定しないとファイルごとの自動判別にな ります。 使える漢字コードは JIS(7 ビットおよび 8 ビット),シフ ト JIS,EUC,DEC です。入力コードは,EUC,DEC あるいはシフト JIS のいずれかと 7 ビット JIS との組み合せに限り,混在が可 能です。JIS の半角仮名は SSII/SSOO,EESSCC((II ともに認識されます。 オオププシショョンン --_O --_I_O _I で入力漢字コードを,_O で出力漢字コードを指定し ま す。 入 力 コードの指定がないときには自動判別に,ま た,どちらも指定しないとき出力コードは 7 ビット JIS になります。 入力コードを指定する _I は以下のうちの 1 つです。 ee EUC(7 ビット JIS 混在可) dd DEC(7 ビット JIS 混在可) ss シフト JIS(7 ビット JIS 混在可) jj,77 または kk 7 ビット JIS 88 8 ビット JIS 出力コードを指定する _O は以下のうちの 1 つです。 ee EUC dd DEC ss シフト JIS jj_X_Y または 77_X_Y 7 ビット JIS(SSII/SSOO による JIS 仮名指示) kk_X_Y 7 ビット JIS(EESSCC((II による JIS 仮名指示) 88_X_Y 8 ビット JIS _O 中の _X_Y で,JIS コード出力でのエスケープシークェ ンスが指定できます。省略すると BBJJ とみなされま す。 なお,補助漢字指定は EESSCC$$((DD で固定です。 _X 漢字指定 BB EESSCC$$BB(第 2 次規格漢字指示) @@ EESSCC$$@@(第 1 次規格漢字指示) ++ EESSCC&&@@EESSCC$$BB(第 3 次規格漢字指示) _Y 英数字指定 Y. Tonooka 1992年11月19日 1 KCC(L) KCC(L) BB EESSCC((BB(ASCII 指示) JJ EESSCC((JJ(JIS ローマ字指示) HH EESSCC((HH(スウェーデン名前用文字指示) --vv 入力コードの判別結果を標準エラー出力に出力します。 --xx 拡 張モード。入力コードの自動判別で,外字や拡張文字 領域(EUC の外字・未定義の半角仮名・制御文字 C1 の 各領域,およびシフト JIS の拡張文字領域)を認識しま す。DEC と EUC との判別はこのモードでのみ,なされま す。 --zz 縮 小モード。入力コードの自動判別で半角仮名を認識し ません(7 ビット JIS を除く)。半角仮名を含ま な い ファ イルの場合,これを指定すると判別の確度が高まり ます。 --hh 半角仮名を DEC に変換すると全角のカタカナに変換され ま すが,このオプションを指定するとひらがなになりま す。 --nn 外字・拡張文字・補助漢字領域を“□”に,半角仮名 の 未定義領域を半角の“・”に変換します。 --bb _b_u_f_s_i_z_e 入 力の判別がつかないあいだ入力をためておくバッファ ーの大きさを指定します。省略時は 8k バイトです。 --cc 変換を行わず,入力コードの種類だけを調べ,結果を 標 準 出 力 に出力します。通常の自動判別の場合とは異な り,ファイルは最後まで調べられます。ただし,途中 で コ ード体系に矛盾が見つかった場合には読み込みを中断 し“data”と表示します。--xx,--zz 以外のオプションは無 効になります。 使使用用例例 %% kkcccc --ee _f_i_l_e 入力コード自動判別で出力コードは EUC %% kkcccc --ssjj _f_i_l_e_1 _f_i_l_e_2 シフト JIS のファイル 2 つを JIS へ変換し連結 %% _c_o_m_m_a_n_d || kkcccc --kk++JJ _c_o_m_m_a_n_d 出力を JIS(JIS 第 3 次規格漢字指示,JIS ロ ーマ字指示,EESSCC((II による JIS 仮名指示)へ %% kkcccc --cc _f_i_l_e _f_i_l_e のコードを判別する(変換は行わない) 補補足足説説明明 入力コードの自動判別は通常の文書においてはほぼ確実に行えま すが,以下のような問題を含んでいます。 7 ビット JIS はエスケープシークェンスによるモード切り替え Y. Tonooka 1992年11月19日 2 KCC(L) KCC(L) によっていて確実に判別されます。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 の漢字であると誤認されてしまうので注意が必要で す。 入力が半角仮名を含まないときには --zz オプションの縮小モード を利用すると判別の確度が高まります。これは重なる領域が JIS 第 2 水準漢字内に限定されるからです。 シフト JIS の拡張領域・EUC の外字領域・EUC の制御文 字 C1 の領域・EUC の半角仮名の未定義領域は,自動判別の認識対象に は入らないので,これらを含む入力では誤った判別がなされてし ま い ます。このときは --xx オプションで拡張モードを指定する か,入力コードを明示的に指定してください。 関関連連項項目目 ccaatt(1) そそのの他他 通常,外字・拡張文字・補助漢字領域はそれぞれの対応する領域 に 投影されます。ただし,シフト JIS への変換で拡張文字領域 からはみ出す文字は,16 進で FCFC になります。 EUC と DEC の 制 御 文字領域 C1 は, JIS へ変換する場合はそのままです が,シフト JIS への場合には削除されます。また,半角仮名 の 未 定義領域は,シフト JIS に変換すると,半角の“・”に置き 換えられます。半角仮名を DEC に変換すると全角の仮名に変 換 されます。 JIS コード出力の場合,改行・タブ・抹消などの制御文字や空白 (半角)は,英数字モードで出力されます。 入力コードの自動判別を誤った場合,また,それぞれの文字セッ トに未定義の文字が入力された場合,出力がどうなるかは不定で Y. Tonooka 1992年11月19日 3 KCC(L) KCC(L) す。 Y. Tonooka 1992年11月19日 4