ログイン TOPに戻る
最近マイブームのcodegenで今度はPHPからCannaを使う拡張を作って見た。

WEBサービスも作った。
http://www.netflowers.co.jp/canna/

すげー。
本当は変換の候補とか出さないと行け無かったりするので、
まぁ、実用性は無いんだけど、、個人的にはちょっと感動。



せっかくなので、ソースは公開。
C言語良くわからないので、これで良いのかさっぱり不明。
わかる方添削してくれると超嬉しいです。

canna-0.0.1.tar.gz

使い方は、

当然ですが、cannaが必要。

yum install Canna
yum install Canna-libs
yum install Canna-devel

あとは、いつもどおり、

tar xvfz canna-0.0.1.tar.gz
cd canna-0.0.1
phpize
./configure
make
make install

php.iniに

extension_dir = "/usr/local/lib/php/extensions/no-debug-non-zts-20060613/"
extension=canna.so

ってすると、

$ret =  kanji_string("honzitu ha seiten nari.");

で、$retに配列で帰ってくる。
array(1) { [0]=> string(16) "本日は青天なり。" }

なんで配列かって言うと、\nで区切って有った場合に分けるため。

で、文字コードはeucで帰ってくるので必要な場合は、mb_convert_encodingなりして下さい。

うまく動いたかた、教えてくれると嬉しいです。

codegenの
canna.xmlは下記の通り

<?xml version="1.0" ?>
<extension name="canna" version="1.0.0">
 <deps language="c" platform="all">
  <with defaults="/usr:/usr/local" testfile="include/canna/jrkanji.h">
   <header name="canna/jrkanji.h" />
   <lib name="canna" platform="all" />
  </with>
 </deps>
 <function name="kanji_string">
  <proto>array kanji_string(string src)</proto>
  <code>
    <![CDATA[

    int c, nbytes ,i,len;
    unsigned char workbuf[1024];
    jrKanjiStatus ks;

   

    jrKanjiControl(0, KC_INITIALIZE, 0);
    {
      jrKanjiStatusWithValue ksv;

      ksv.ks = &ks;
      ksv.buffer = workbuf;
      ksv.bytes_buffer = 1024;
      ksv.val = CANNA_MODE_HenkanMode;
      jrKanjiControl(0, KC_CHANGEMODE, &ksv);
    }
    len = (int) strlen(src);
    array_init(return_value);
   
    for (i=0;i<len;i++) {
      nbytes = jrKanjiString(0, (int)src[i], workbuf, 1024, &ks);
      if (nbytes > 0) {
        workbuf[nbytes] = '\0';
        add_next_index_stringl(return_value, workbuf,nbytes,1);
      }
    }

    if(src[len-1] != '\n'){
      nbytes = jrKanjiString(0, '\n', workbuf, 1024, &ks);
      if (nbytes > 0) {
        workbuf[nbytes] = '\0';
        add_next_index_stringl(return_value, workbuf,nbytes,1);
      }
    }

    jrKanjiControl(0, KC_FINALIZE, 0);
   

    ]]>
  </code>
 </function>

</extension>


コメントはこちらから
名前:
通信:
※オーナーにのみ表示されます。(mail やホームページのurl等ご入力ください)
本文:
トラックバックはこちらから
トラックバックURL: