cd Canna37p3インストールされた結果
xmkmf
make canna
sudo make install
最初の状態に戻すには、make clean
何らかのエラーが出てコンフィグをやり直す場合 make reconfig
アンインストールする場合は、usr/local/にある canna ディレクトリ を ゴミ箱へ。usr/local/canna ---+ + sbin cannaserver... かな漢字変換サーバ cannakill (エイリアス) + lib libRKC.a ... 辞書アクセスライブラリリモート版 libRKC16.a libcanna.a ... ユーザインタフェースライブラリ libcanna16.a libcanna.1.2.dylib libRKC16.1.2.dylib libRKC.1.2.dylib + include + canna ......ヘッダ類 RK.h keydef.h pubconf.h sysdep.h jrkanji.h mfdef.h + share + canna + sample .... ローマ字かな変換の設定。拡張子 .canna + dic ......... 辞書類、変換テーブル + canna .... 追加辞書や基本辞書を入れる場所。 default.canna + bin cannastat ....かんなの状態を表示するツール その他、色々なファイル、設定ツールが入っている。
/Canna37p3/dic/ideo/words にあるかんな本体の付属語辞書ファイルも手動インストールしてあることも忘れずに。
iroha.cld
iroha.cbd
bushu.cbd
bushu.cld
dics.dir
を
/usr/local/canna/share/canna/dic/canna
にファイルをコピー。
/Canna37p3/dic/ideo/grammor にある
fuzokugo.cbd
も、
/usr/local/canna/share/canna/dic/canna
に コピーする。
make: crxdic: Command not found make: *** [maindic] Error 127とエラーが出てしまったら
cd cannadic-0.95c /usr/local/canna/bin/crxdic -m -o gcanna.cbd gcanna.ctdcrxdicコマンドで、自立語辞書について gcanna.cbd が生成され、crfreqコマンドで、 gcanna.cld が生成される。
/usr/local/canna/bin/crfreq -div 512 gcanna.cbd gcanna.mwd
/usr/local/canna/bin/crxdic -s -o gcannaf.cbd gcannaf.ctd
/usr/local/canna/bin/crfreq gcannaf.cbd gcannaf.swd
sudo install -o bin -g bin -m 0664 gcanna.c[bl]d /usr/local/canna/share/canna/dic/canna(※ cannaと共に /usr/local/canna/bin にインストールされている cannna の コマンド crxdic,crfreq を使います。)
これでダメなら ...かんな追加辞書を手動でインストールする。
gcanna.cld
gcanna.cbd
gcannaf.cbd
gcannaf.cld
/usr/local/canna/share/canna/dic/canna に辞書ファイルをコピーする。
かんなが既に動作している時に、cannastat を使った結果。
user:~ uer$ /usr/local/canna/bin/cannastat
Connected to unix
Canna Server (Ver. 3.7)
No clients
かんなサーバーが起動していて、かんなクライアントが起動している時の cannastat の結果
user:~ user$ /usr/local/canna/bin/cannastat Connected to unix Canna Server (Ver. 3.7) Total connecting clients 1 USER_NAME ID NO U_CX C_TIME U_TIME I_TIME HOST_NAME CLIENT user 0 0 2 Sat 18 5:03pm 0 20 user.loca
かんなクライアントを含むプログラムが jrKanjiControl(0, KC_FINALIZE, 0); する前に強制終了したりすると、クライアントが残ることがあります。
このときcannakill を使うと、全ての clients を終了させることができます。
かんなが動作していない時に、cannastat を使った結果。
user:~ user$ /usr/local/canna/bin/cannastat
Error Disconnected
かんなサーバが起動失敗したときの結果。たいていは、辞書ファイルを入れてないのが原因。ktrace と kdump を使って原因を探る方法
sudo /usr/local/canna/sbin/cannaserver
cannaserver:Initialize failed
xcode ターゲット
/usr/local/canna/ に かんな ライブラリがインストールされているので
-L/usr/local/canna/lib -lcanna を追加↓ Carbon フレームワークも追加。-framework Carbon
その他のMach-0 リンカフラグ
-L/usr/local/lib -lglyph-allegro -lfreetype -lalleg-main -L/usr/local/canna/lib -framework Carbon
検索パス ヘッダに追加
/usr/local/canna/include/
// かんなサーバーへ接続出来るが、変換はEUC-JP。 キー入力処理はAllegroを使用。 ///* * canna クライアント */ #include <stdio.h> #include <canna/jrkanji.h> #include <Carbon/Carbon.h> #include <Allegro/allegro.h> #define MAX_SIZE 1024 // ******* canna 用の変数 ******* char buffer[1024]; jrKanjiStatus ks; int ret; int main(int argc, const char *argv[]) { int val,scancode; // canna はEUC なので あとで、UTF8 に変換するつもり。 set_uformat(U_UTF8); allegro_init(); install_keyboard(); // ******* canna の初期化 ******* jrKanjiControl(0, KC_INITIALIZE, 0); // canna 変換モードに移行 jrKanjiStatusWithValue ksv; ksv.ks = &ks; ksv.buffer = buffer; ksv.bytes_buffer = MAX_SIZE; ksv.val = CANNA_MODE_HenkanMode; jrKanjiControl(0, KC_CHANGEMODE, &ksv); // ************************************ if (set_gfx_mode(GFX_AUTODETECT, 320, 200, 0, 0)) { allegro_message("Error setting 320x200x8 gfx mode:\n%s\n", allegro_error); return -1; } clear_to_color(screen, makecol(255, 255, 255)); while(!key[KEY_ESC]){ // キー入力の監視 poll_keyboard(); // if( keypressed() ){ //スキャンコードを得る val = ureadkey(&scancode); // ******* canna に渡す ******* ret = jrKanjiString(0, val , buffer , 1024, &ks); if (ret >1 ){ buffer[ret] = '\0';} printf("buffer:%s ret:%d val:%d \n",buffer,ret ,val ); textout_centre_ex(screen, font, "Hello, world?", 160, 96, makecol(0, 0, 0), -1); // } } // ******* canna クライアントを終了する ******* jrKanjiControl(0, KC_FINALIZE, 0); return 0; } END_OF_MAIN();
結果
buffer:t ret:0 val:116
buffer:e ret:0 val:101
buffer:s ret:0 val:115
buffer:u ret:0 val:117
buffer:t ret:0 val:116
buffer:o ret:0 val:111
buffer: ret:0 val:32
buffer:\245\271\245\310 ret:6 val:13 ← EUCコード8進 で返ってくるが、Allegroは UTF8だ。
kakashiさてどうするか。OSX の内部コードは UTF16。Allegroのユニコード取得関数 で調べると UTF16コードで返ってくる。
buffer:\244\253\244\253\244\267
EUC コード 8進数。
eucコード(8進) eucコード(10進) eucコード(16進)
か 244 253 164 171 a4 ab
か 244 253 164 171 a4 ab
し 244 267 164 183 a4 b7
Xcode の実行ログ出力結果/* * canna client (EUC <--> UTF8 convert by nkfm library ) with Allegro+GlyphKeeper * ver 0.0 * Created by Tsukubado on Sat Feb 18 2006. * Copyright (c) 2006 __MyCompanyName__. All rights reserved. */ #include<Carbon/Carbon.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <canna/jrkanji.h> #include <libnkfm.h> #include <Allegro/allegro.h> #define GLYPH_TARGET GLYPH_TARGET_ALLEGRO #include <glyph.h> #define MAX_SIZE 1024 //***** かんな関連変数 ***** char buffer[256]; char buffer_b[256]; jrKanjiStatus ks; int ret,i; //***** nkf 関連変数 ***** #define BUFFERSIZE 256 char outbuf[BUFFERSIZE]; size_t in_byte, out_byte; size_t buflen = 255; int main(int argc, const char *argv[]) { int val,scancode; //***** Glyph Keeper 関連変数 ***** GLYPH_FACE *face; GLYPH_REND *rend; //***** nkfライブラリもどき 初期化 ***** // nkfの オプションはハイフンを付ける。 nkf_init("-w"); //***** allegro 初期化 ***** set_uformat(U_UTF8); allegro_init(); install_keyboard(); chdir(".."); //***** Glyph Keeper 初期化 ***** gk_library_init(); GLYPH_KEEP *keep;//glyph cache を定義 keep = gk_create_keeper(1000,8*1024*1024);//キャッシュサイズ if (!keep) { /* 失敗したとき */ } face = gk_load_face_from_file("/System/Library/Fonts/ヒラギノ角ゴ Pro W6.otf",0); rend = gk_create_renderer(face,keep); gk_rend_set_keeper(rend,keep); gk_rend_set_size_pixels(rend,18,18); gk_rend_set_text_color(rend,29,102,255); font = gk_create_allegro_font ( rend ); //***** Canna クライアント 初期化 ***** jrKanjiControl(0, KC_INITIALIZE, 0); jrKanjiStatusWithValue ksv; ksv.ks = &ks; ksv.buffer = buffer; ksv.bytes_buffer = MAX_SIZE; ksv.val = CANNA_MODE_HenkanMode; jrKanjiControl(0, KC_CHANGEMODE, &ksv); //***** Allegro Window の 初期化 ***** if (set_gfx_mode(GFX_AUTODETECT, 600, 220, 0, 0)) { allegro_message("Error setting 320x200x8 gfx mode:\n%s\n", allegro_error); return -1; } set_window_title("日本語文字入力 のテスト"); clear_to_color(screen, makecol(255, 255, 255)); //***** 入力ループ開始 ***** while(!key[KEY_ESC]){ poll_keyboard(); // if( keypressed() ){ val = ureadkey(&scancode); //***** 文字列変換処理 by かんな ***** ret = jrKanjiString(0, val , buffer , 1024, &ks); if (ret >1 ){ buffer[ret] = '\0';}// 終端文字列 in_byte = strlen(buffer) + 1; if ( in_byte > 2){ // ***** 文字コード変換処理 by nkf ライブラリ もどき ***** /* nkf_n_convert(char *outbuf, size_t outbuflen, const char *inbuf);*/ nkf_n_convert( outbuf , buflen, buffer ); clear_to_color(screen, makecol(255, 255, 255)); printf("★★★★ コンバート中 ★★★★ \n"); } // ***** スクリーン表示 ***** if (ret <1 ){ clear_to_color(screen, makecol(255, 255, 255));} /* 次の単語を入れるときに、 それまでの入力中の文字列を強制的に消去 KC_KILL */ if (ret > 0 && in_byte > 2 ){ jrKanjiControl(0, KC_KILL , &ksv ); strncpy( buffer , buffer_b , 512 ); } printf(" buffer-EUCJP:%s out-UTF8:%s ret:%d inbyte :%d \n", buffer ,outbuf ,ret, in_byte ); textout_centre_ex(screen, font, "*Canna client(convert by nkf-modoki lib)*" , 200, 26, makecol(0, 0, 0), -1); textprintf_centre_ex(screen, font, 200, 50, makecol(0, 155, 255),-1, "変換前(EUC-JP) : %s , byte: %d ",buffer ,in_byte ); textprintf_centre_ex(screen, font, 200, 80, makecol(255, 155, 0),-1, "変換結果(UTF-8) : %s ",outbuf ); textprintf_centre_ex(screen, font, 200, 100, makecol(255, 155, 0),-1, "内部バッファ : %s ",ksv.buffer ); textprintf_centre_ex(screen, font, 200, 120, makecol(255, 155, 0),-1, "CANNA_MODE_HenkanMode : %d ",ksv.val ); } // ***** かんなクライアントの終了 ***** jrKanjiControl(0, KC_FINALIZE, 0); // ***** GlyphKeeper 終了処理 ***** gk_unload_face (face );//フェイスデータを破棄 gk_library_cleanup();//フォントのメモリを解放 return 0; } END_OF_MAIN();
スペースキーを押すたびに、次候補に変換されます。リターンキーで確定。 buffer-EUCJP:k out-UTF8: ret:0 inbyte :2 buffer-EUCJP:a out-UTF8: ret:0 inbyte :2 buffer-EUCJP:k out-UTF8: ret:0 inbyte :2 buffer-EUCJP:a out-UTF8: ret:0 inbyte :2 buffer-EUCJP:s out-UTF8: ret:0 inbyte :2 buffer-EUCJP:h out-UTF8: ret:0 inbyte :2 buffer-EUCJP:i out-UTF8: ret:0 inbyte :2 ★★★★ コンバート中 ★★★★ buffer-EUCJP: out-UTF8:かかし ret:6 inbyte :7 hanayoridango (リターンキー) [Session started at 2006-03-18 18:04:59 +0900.] buffer-EUCJP:h out-UTF8: ret:0 inbyte :2 buffer-EUCJP:a out-UTF8: ret:0 inbyte :2 buffer-EUCJP:n out-UTF8: ret:0 inbyte :2 buffer-EUCJP:a out-UTF8: ret:0 inbyte :2 buffer-EUCJP:y out-UTF8: ret:0 inbyte :2 buffer-EUCJP:o out-UTF8: ret:0 inbyte :2 buffer-EUCJP:r out-UTF8: ret:0 inbyte :2 buffer-EUCJP:i out-UTF8: ret:0 inbyte :2 buffer-EUCJP:d out-UTF8: ret:0 inbyte :2 buffer-EUCJP:a out-UTF8: ret:0 inbyte :2 buffer-EUCJP:n out-UTF8: ret:0 inbyte :2 buffer-EUCJP:g out-UTF8: ret:0 inbyte :2 buffer-EUCJP:o out-UTF8: ret:0 inbyte :2 ★★★★ コンバート中 ★★★★ buffer-EUCJP: out-UTF8:はなよりだんご ret:14 inbyte :15 hanayoridango (スペース) (リターンキー) buffer-EUCJP: out-UTF8:な ret:2 inbyte :3 buffer-EUCJP:h out-UTF8:な ret:0 inbyte :2 buffer-EUCJP:a out-UTF8:な ret:0 inbyte :2 buffer-EUCJP:n out-UTF8:な ret:0 inbyte :2 buffer-EUCJP:a out-UTF8:な ret:0 inbyte :2 buffer-EUCJP:y out-UTF8:な ret:0 inbyte :2 buffer-EUCJP:o out-UTF8:な ret:0 inbyte :2 buffer-EUCJP:r out-UTF8:な ret:0 inbyte :2 buffer-EUCJP:i out-UTF8:な ret:0 inbyte :2 buffer-EUCJP:d out-UTF8:な ret:0 inbyte :2 buffer-EUCJP:a out-UTF8:な ret:0 inbyte :2 buffer-EUCJP:n out-UTF8:な ret:0 inbyte :2 buffer-EUCJP:g out-UTF8:な ret:0 inbyte :2 buffer-EUCJP:o out-UTF8:な ret:0 inbyte :2 buffer-EUCJP: out-UTF8:な ret:0 inbyte :2 ★★★★ コンバート中 ★★★★ buffer-EUCJP: out-UTF8:花よりだんご ret:12 inbyte :13 hanayoridango(スペースキー) (スペースキー) (リターンキー)(リターンキー) buffer-EUCJP:h out-UTF8:0 ret:0 inbyte :2 buffer-EUCJP:a out-UTF8:0 ret:0 inbyte :2 buffer-EUCJP:n out-UTF8:0 ret:0 inbyte :2 buffer-EUCJP:a out-UTF8:0 ret:0 inbyte :2 buffer-EUCJP:y out-UTF8:0 ret:0 inbyte :2 buffer-EUCJP:o out-UTF8:0 ret:0 inbyte :2 buffer-EUCJP:r out-UTF8:0 ret:0 inbyte :2 buffer-EUCJP:i out-UTF8:0 ret:0 inbyte :2 buffer-EUCJP:d out-UTF8:0 ret:0 inbyte :2 buffer-EUCJP:a out-UTF8:0 ret:0 inbyte :2 buffer-EUCJP:n out-UTF8:0 ret:0 inbyte :2 buffer-EUCJP:g out-UTF8:0 ret:0 inbyte :2 buffer-EUCJP:o out-UTF8:0 ret:0 inbyte :2 buffer-EUCJP: out-UTF8:0 ret:0 inbyte :2 buffer-EUCJP: out-UTF8:0 ret:0 inbyte :2 buffer-EUCJP: out-UTF8:0 ret:0 inbyte :2 ★★★★ コンバート中 ★★★★ buffer-EUCJP: out-UTF8:鼻よりだんご ret:12 inbyte :13
> canna/widedef.h: MacOS X 10.4 supportとあります。
> * server/util.c: The unused part was enabled by mistake. Disable it.
widedef.h の Revision 1.9 - (download)この2つのファイルを上書きしておけば OSX10.4 Tigerでも canna がうまくビルドされます。
http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/canna/canna/canna/widedef.h?rev=1.9&view=log
ここから widedef.h をダウンロードして、 /Canna37p3/canna ディレクトリの中に入れ上書きする。
util.c の Revision 1.9 - (download)
http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/canna/canna/server/util.c?rev=1.9&only_with_tag=HEAD&view=log
ここから util.c をダウンロードして、 /Canna37p3/serverディレクトリの中に入れ上書きする。
/* うまく動かない*/
#import <Cocoa/Cocoa.h> const char *out_buf;
NSString* cocoa_str;
char euc_char[1024] = "\244\253\244\253\244\267";
NSData *data = [NSData dataWithBytes:euc_char length:strlen(euc_char)];
cocoa_str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
printf("gyaaaaa \n");
out_buf=[ cocoa_str cString];
printf( "out %s \n",out_buf );
data = [ NSData //NSDATA 形式です。
dataWithBytes:str //Byte形式で入ってるデータ(data)は:str
length :strlen(str) //長さ: Strlen(str)
];
string = [[ NSString alloc ] //以下のように、NSString を割り当て(alloc)て、string に代入する
initWithData: data // 初期値のデータは:data
encoding : NSUTF8StringEncoding // エンコーディングは :NSUTF8StringEncoding
];