OSXで canna を使う。

 

日本語入力変換システム canna「かんな」 の覚え書き for MacOS X

および nkf2.0 文字コード変換フィルタ の組み込み。
テキストエディタのような複雑な処理を使うアプリケーションなら、 Cocoa & Interfacebuilder を使ったほうが楽です(ことえりも使えるし)。
このページでは、Cocoaにあまり頼らないで、MacOSXでのその他日本語入力と、文字コードの変換する方法(EUC-JP から UTF-8 )について調べています。

主な環境は、MacOSX 10.3.9、 10.4.5 、Xcode, C言語

  • かんな をインストールする。
  • かんなを動かす。
  • libcanna かんなライブラリを使う 。 ←まだここまで

  • 正常な文字コード変換を行う。EUC-JP から UTF8へ変換する方法を模索。
  • OSXで、かんなクライアントを組み込んだアプリでのひらがな入力&UTF8コードで表示が目標。←まだここまで
  • かんなクライアントで、簡単な候補表示をする
  • ひらがな、漢字などの、文字列変換を行う。変換候補の表示

    canna (かんな)は、元々NECが作っていたもので、現在は有志によって開発が進められている 日本語入力変換システム。Windows 、Linux 、UNIX 等で動作します。 canna は、サーバークライアント型プログラムで、cannaserver (かんな サーバー)が常時動作していて、日本語入力があれば、アプリ側に組み込まれた クライアントから、サーバーに接続して変換処理をする仕組みです。

    かんな に限らず、ほとんどのオープンソースの日本語入力システムで注意すべきことは、変換後に出力される文字コード EUC-JP になっていることです。 文字コードのエンコーディングが違えば文字が正しく表示されません。正しく表示するためには、変換ライブラリを使う必要があります。

    かんな マニュアル

    NEC のページにあり、そこからドキュメント類をダウンロードできます。
    オンラインマニュアル には使いかたや libcanna のAPIリファレンスが載っています。
    これらの文書は、PDF形式なので、OSXの場合は「プレビュー」を使って読むことができます。

    マニュアルには、libcanna を使ってクライアント側を作成するための情報も揃っています。API の使い方は他の入力システムのライブラリと比べてシンプルです。

    cannaをダウンロードする。

    日本語入力システム「かんな」 のページから、ダウンロード
    Canna37p3.tar.bz2 を解凍する。INSTALL.jp、README.jp を読む。

    cannaをビルド・インストールする

    ※10.4 Tigerで cannaをビルドする時の注意(2006年3月18日現在)

    ※ X11環境を先にインストールしておいてください。
    これは、canna をビルドするのに、X11の Imake が必要なためです。 cannaserver自体はX11がなくても動きます。
    X11は OSX 10.4ならMacOSX install DVDのオプションインストールからインストールすることができます。10.3ならインストールディスク3枚目。

    収録されている Canna.conf を編集して インストール場所等、ビルド設定を変更することもできます。
    各OS環境にあわせた設定がなされて、makeの準備が整います。


    以下は、Canna.conf を編集せず、デフォルト設定でインストールした結果を記します。
    デフォルトの場合、インストールされるディレクトリは、/usr/local/canna になります。
    X11.appがインストールされていれば、ターミナルからのコマンド入力でもOK

    ターミナルから...
    cd Canna37p3
    xmkmf
    make canna
    sudo make install

    最初の状態に戻すには、make clean
    何らかのエラーが出てコンフィグをやり直す場合 make reconfig
    インストールされた結果
    OSXでは、共有ライブラリは .so ではなく、.dylib でインストールされます。
    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 ....かんなの状態を表示するツール
             その他、色々なファイル、設定ツールが入っている。
    
    
    アンインストールする場合は、usr/local/にある canna ディレクトリ を ゴミ箱へ。

    cannaを使う

  • デフォルトの辞書ファイルを入れる
  • かんな追加辞書を入れる
  • canna を有効にする (cannaserverの起動)
  • 対応しているプログラムで日本語変換入力する
  • canna を無効にする (cannaserverの終了)

    デフォルトの辞書ファイルをインストールする

    cannaserver は、デフォルトの辞書ファイルが入っていないと「cannaserver:Initialize failed」メッセージが出て起動しません。
    MacOSX では、make しても辞書ファイルが自動的にインストールされないようなので手動で入れます。
    かんな本体の辞書ファイルを手動インストールする。
    /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
    に コピーする。

    かんな追加辞書をインストール/使ってみよう

    かんなの変換効率をもっと充実させるには、かんな追加辞書もインストールしておくと便利です。
  • 辞書に登録する。
    cannaマニュアルを参照。

  • 辞書を追加する。
     ※接続中のかんなクライアントを全て終了してから行って下さい。/usr/local/canna/sbin/cannakill
     
    フリーの追加辞書が配布されています。
    配布元:かんな辞書(14万語を収録!)

    そこで、この辞書を導入することにします。cannadic-0.95c.tar.gz というのが該当ファイルです。
    この辞書は、テキスト辞書をバイナリ辞書にして使うので、makeファイルがついてます。

    その前に、 /usr/local/canna/share/canna/dic/canna ディレクトリを確認して、ファイルがなければ
    /Canna37p3/dic/ideo/grammar/にある fuzokugo.cbd を /usr/local/canna/share/canna/dic/canna に コピーしておいてください。

    そうしないと後で辞書ファイルを生成する時に
    Warning: cannot open grammar file /usr/local/canna/share/canna/dic/canna/fuzokugo.cbd.
    というエラーが出てmakeが失敗します。 OSX版は、fuzokugo.cbd 等の辞書を自動的にインストールしない!?

    もし、ターミナルから普通に makefileを実行 しようとして、
    make: crxdic: Command not found  make: *** [maindic] Error 127
    とエラーが出てしまったら
    次のように直接コマンドを打ってテキスト辞書(.ctd)を、バイナリ辞書(.cbd)変換して下さい。
    cd cannadic-0.95c /usr/local/canna/bin/crxdic -m -o gcanna.cbd gcanna.ctd
    /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
    crxdicコマンドで、自立語辞書について gcanna.cbd が生成され、crfreqコマンドで、 gcanna.cld が生成される。
    また付属語辞書についても、gcannaf.cbd、gcannaf.cld がそれぞれ生成される。
    後は、これらのバイナリ辞書(.cbd, .cld)をかんな辞書ディレクトリにコピーして、Root権限 でパーミッションと所有権を設定する。
    所有権はbinではない場合がある。

    ※デフォルトで、/usr/local/canna/share/canna/dic/canna に辞書ファイルを置く場合。
    sudo install -o bin -g bin -m 0664 gcanna.c[bl]d /usr/local/canna/share/canna/dic/canna

    これでダメなら ...かんな追加辞書を手動でインストールする。
    gcanna.cld
    gcanna.cbd
    gcannaf.cbd
    gcannaf.cld
    /usr/local/canna/share/canna/dic/canna に辞書ファイルをコピーする。
    (※ cannaと共に /usr/local/canna/bin にインストールされている cannna の コマンド crxdic,crfreq を使います。)

    かんなサーバーの起動・終了・状態を見る、各種コマンド

  • かんなサーバーの起動【cannaserver】 sudo /usr/local/canna/sbin/cannaserver
  • かんなサーバーの終了【cannakill】 sudo /usr/local/canna/sbin/cannakill
  • かんなサーバーの状態を見る【cannastat】/usr/local/canna/bin/cannastat
  • 辞書情報【cannacheck】/usr/local/canna/bin/cannacheck : 詳しい状態を見れるが、文字化けして、肝心の部分が不明。

    かんなが既に動作している時に、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
    かんなサーバが起動失敗したときの結果。たいていは、辞書ファイルを入れてないのが原因。
    sudo /usr/local/canna/sbin/cannaserver
    cannaserver:Initialize failed
    ktrace と kdump を使って原因を探る方法
    cannaserver:Initialize failed
    user:~ user$ sudo ktrace /usr/local/canna/sbin/cannaserver -v
    cannaserver:Initialize failed
    user:~ kone$ sudo kdump >log
    すると ホームディレクトリ直下に log というテキストファイルができるので、中身をみてみる。


  • canna クライアント対応アプリケーションを作る

  • canna Client ( かんなクライアント)を作る
    自作のアプリケーションを canna 入力に対応させるには、 libcanna のAPI を利用して、かんなクライアントを組み込む。
    cannadoc.pdf の128〜147ページ 第 5 章 かな漢字変換ライブラリ

    EUC文字コードで入出力を扱うには、jrKanjiString ,jrKanjiControl, wcCloseKanjiContext 関数を使います。
    ワイド文字(2byte文字)では、wcKanjiString ,wcKanjiControl, wcCloseKanjiContext 関数を使います。
    この場合は、wchar.h をインクルードする等し、変数型に wchar_t を使う必要があります。

    Apple Developer Connectionによれば、ワイド文字はMac OS X v10.3以降に対応している。
    printf("%d\n",sizeof(wchar_t));
    OSX では sizeof(wchar_t) = 4 となっている。
  • 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
    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      
    さてどうするか。OSX の内部コードは UTF16。Allegroのユニコード取得関数 で調べると UTF16コードで返ってくる。
    1. ここで、 iconv をインストールして、EUC→UTF8変換する (たしか iconv にも色々種類があって GPLのだとかそうでないものとか)
    2. Cocoa の NSDATA に入れて NSString と UTF8String でエンコーディングを変えて変換する。
    3. Cocoa から Unixコマンドへパイプするコードを書いてそこから nkf を使って変換する。(→ Cocoa は ヤッパリへ )
    4. Cocoa から Unixコマンドへパイプするコードを書いてそこから Perl を使って変換する。(→ Cocoa は ヤッパリへ )
    5. C標準ライブラリの wchar_t とか使ってみる。(OSX にあれば。)
    6. OSXの Text Encoding Conversion Manager を使う
    7. nkfライブラリもどき を使ってみる
    8. あきらめる
    ※cannaserverが起動していないときに、cannaクライアントを使うと、ローマ字->かな 変換 機能だけは使えます。

    文字コード変換処理を組み込んだサンプルコード

    7. nkfライブラリもどき を使ってみる

    動作はまだまだアレなので、動作確認用サンプルです。
    ローマ字入力して、リターンキーを押せば、何か文字が出ます。
    リターンキーを押さずスペースキーを何回か押して、リターンキーを何回か押せば変換候補が適用されます。

  • キーボード入力、ウインドウ表示はAllegro ライブラリを使っています。
  • 日本語文字を表示するには、GlyphKeeper、FreeType ライブラリが必要です。
  • 日本語文字変換システムには、Canna、Cannaクライアント を使っています。
  • 文字コード変換には、libnkfm nkf ライブラリもどきが必要です。
  • プログラム中で使われている文字コードは UTF8 です。
    /*
     *	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();
    
    
    Xcode の実行ログ出力結果
    スペースキーを押すたびに、次候補に変換されます。リターンキーで確定。
      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  
    
  • 10.4 Tiger でCannaをビルドするときの注意

    Canna37p3 は MacOSX 10.4Tiger に対応していません。

    途中でmakeに失敗し、cannaserver や、cannastat のバイナリが作成されません。
    また、Tiger対応版のアーカイブが用意されておらずダウンロードできない状況です。

    しかし、canna のCVSの最新版ではこの問題では、修正されていて Tiger に対応しているようです。
    http://lists.sourceforge.jp/mailman/archives/canna-cvs/2005-May/001122.htmlによると、
    > canna/widedef.h: MacOS X 10.4 support
    > * server/util.c: The unused part was enabled by mistake. Disable it.
    とあります。
    そこで、widedef.h と、util.c のファイルをSourceForge のCVSから持ってくることにします。
    日付で探すと見つかりやすいです。9month とか 2month 等
    widedef.h の Revision 1.9 - (download)
    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ディレクトリの中に入れ上書きする。
    この2つのファイルを上書きしておけば OSX10.4 Tigerでも canna がうまくビルドされます。

    リンクその他

  • Kanji Code Conversion Programs のページ(nkfm ライブラリ)
  • kinput2: X window で日本語入力するためのシステム。
  • かんな:          かんなサーバー       ←→ かんなクライアント 組み込みアプリケーション
  • えせかんな : 他の変換エンジン ←→ えせかんな (疑似かんなサーバー) ←→ かんなクライアント 組み込みアプリケーション
  • im-cannaを作る
  • kinput2への「変換」キー対応パッチの作成 OSX でIME
  • SIMBL(Simple Input Manager Bundle Loader)
  • Text Service Manager(TSM)

    ターミナルから、Emacs

  • Emacs Beginner's HOWTO
  • ピリオド.で始まるファイル名に変更する:mv filename .filename (逆の変更も同じ、これは .htaccess 等のファイルを用意する時にも応用できる)

  • Emac の設定ファイル(ユーザーホームに「.emacs」 というファイルを作成):mv emacs .emacs
  • Emacs の起動:emacs
  • Emacs の終了(Emacから):Ctrl + x + c
  • Imput Method の指定(Emacから):Esc + x set-input-method (リターン)
  • emacs の基本的な使い方と日本語入力

    Canna と 関係ない話。
    QuickTime 7.0.4 にアップデートしたらXcode でQuickTime expected to be defined〜 エラーが出てビルドが失敗してしまう。Apple のウェブサイトにQuickTime Reinstallerがあるので Quick Time 7.0.1 に戻せば治ります。 Developper Tool の再インストールで治るという話も聞くけど面倒。

  • ジャンクヤード

    失敗したものを置いておく場所。

  • Cocoa の NSDATA に入れて NSString と UTF8String で変換する。
    他の文字コードはNSData としてバイナリのデータとして扱い指定したエンコーディングで、NSString に変換する。
    /* うまく動かない*/
    #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
    ];

  • Last modified 2006.3.18 canna を Tigerで使う方法。
    Tsukubado