Ruby/CHISEは、XEmacs CHISEにおけるChaon実装を
Rubyへ移植することを試みたモジュールである。
Chaonモデルとは、文字を符号ではなく属性によって扱う方法を意味する。
Ruby/CHISEではそれを拡張し、文字をオブジェクトとして扱っている。
展開して、make installする。
通常、/usr/local/lib/ruby/site_ruby/以下にinstallされる。
src/chise.rb内
DB_DIR = '/usr/local/lib/xemacs-21.4.10/i686-pc-linux/char-db'
必要に応じて変更する。
IDS_DB_DIR = '/home/eto/work/chise/ids/''
IDSのテキストファイルが置かれているディレクトリーを指す。(下記の字形分解・合成についてを参照)
下記のパッケージが必要。
一般にRubyのパッケージは RAAを使って探すことができる。
現状では、Ruby/CHISEに渡す文字コードはUTF-8のUnicodeにしておくと便利である。
これは望ましいものではなく、将来的にはプログラム自体がSJIS、EUCなどで書かれていても 問題なく処理できるようにする予定である。
WindowsでUnicodeを使えるエディターとして、私はMeadow + Mule-UCSを使っている。
他、Windows付属のメモ帳を使うことができる。
また、見るだけであればIEに落すと表示される。
フリーのUnicode対応エディターとして他にYuditがあるが、まだよく使い方はわからない。
require 'chise' include CHISE str = "字" #Stringを拡張している。UTF8で与えること。 p str.ucs #とすると、その文字のucsの値が表示される p str.total_strokes #画数が表示される p str.chinese_gb2312 #などなど str.char.alist.each {|a, v| #こんな感じで全属性を表示できる print a, ': ', v, "\n" } p str.inspect_x #Characterについての情報が表示される。 p str.inspect_all #持っている属性情報を全て表示する。 str = "文字列" #もちろん一文字でなく文字列も扱える。UTF-8で与える。 p str.inspect_x #各文字の情報が表示される。 p str.inspect_all #各文字の属性情報を全て表示する。
下記のような文章を入力、表示できるようになることを例として考える。
が、まだ入力できません。未完成です。
Ruby/CHISEは、もともと字形分解・合成を扱うために作られたため、その機能が強化されている。
字形分解・合成は、現在はUnicodeにおけるIDS(Ideographic Description Structure)という仕様に準拠している。 U+2FF0〜U+2FFBで表わされるIDC(Ideographic Description Characters)によって合成方法を指定し、 これに続く二文字から三文字の文字を合成して表示する。
これは元々必要な漢字が文字コードに無い場合にその代替物として表記するために考えられた仕様だ。 もし文字表示機能が字形合成に対応している場合は、その合成された字を表示する。 もし字形合成の機能が無い場合は、IDC自体を目に見えるように表示し、 ユーザーの想像力に任せることになる。
実際のところ、IDSを使った字形合成機能を持つ文字表示エンジンが存在するとは聞いたことがない。 そのため現状ではこの仕様は絵に書いた餅になっている。
ここではその仕様を転用し、漢字の字形を指示するために使っている。
ちょっと想像してみればわかるが、IDSはまともな実装が存在していないことからもわかる通り、 普通には使えない仕様である。実際に漢字の字形を合成して表示するといっても、 縦とか横につらなるなどといった単純な情報だけでは不十分で、もっと多様な情報が必要である。 部品間の大きさのバランスなど、ついheuristicな方法で対処できるのではないかと考えてしまいがちだが、 実際に見ておかしくない字を作るためには現状ではまだ人手によってデザインする必要がある。 ここではその仕様を転じて、字形の成立ちを説明するために使っているが、 このような使い道なら使えるようだ。
下記のようにして、IDSのテキストファイル群を持ってくる。
% cd ~/work/chise (このディレクトリーは適宜変更する) % cvs -d :pserver:anonymous@cvs.m17n.org:/cvs/root login password: (何も入れずにただもう一度return) % cvs -d :pserver:anonymous@cvs.m17n.org:/cvs/chise co -d ids ids
このようにすると、IDSのテキストファイル群を持ってくることができる。
その後、src/chise.rb内
IDS_DB_DIR = '/home/eto/work/chise/ids/''
ここに、上記のIDSテキストファイル群を持ってきたディレクトリーを入れる。
必要であれば、再度make installする。
このようにして適切にIDS_DB_DIRを設定し、
./tools/idsdbdumpall.rbを実行する。(かなり時間がかかる)
これで、文字属性として新たにids, ids-decomposeが加わった。
それぞれ、IDSの文字列、それを再帰的に分解しきったものを意味する。
実用上は差し支えない範囲だが、IDSテキストファイルにはまだ入力されて いない字もある。./tools/idscheckintegrity.rbを実行する(かなり時 間がかかる)と、IDSの木構造の整合性をチェックし、整合性がとれていない字 を表示する。
Stringに、decompose, decompose_allという二つのメソッドがある。 decomposeは一段階だけ分解する。decompose_allはそれを再帰的に行う。
p "字".decompose p "字".decompose_all p "榊".decompose p "榊".decompose_all p "終了".decompose p "終了".decompose_all p "鬱".decompose p "鬱".decompose_all
最初の説明から、字形分解されて出てきた結果の文字列には、 IDSキャラクターが含まれているため、場合によってはうまく表示されない。 メモ帳だと表示できるだろう。
分解の逆に合成することもできる。ことにしようと思っているが、まだできていない。
まじめなメソッドの説明を書く。(未完)
class String char 先頭の文字をCharacterに変換したものを返す →method_missingで、存在しないmethodを指定すると、自動的に先頭の文字を Characterに変換してそれへのmethodとして呼ぶ。 class Character get ある文字をgetする。(flyweightパターン) [] ある属性をgetする。get_char_attributeも使える。 またmethod_missingも使える。 []= ある属性をputする。put_char_attributeも使える。 またmethod_missingによる入力も使える。 存在しない属性を参照したときは、nilが返る。
詳しくはtools/READMEを参照。
Ruby/M17Nとの整合性をどうとればいいか。
Ruby/M17Nブランチが本体に反映されるのは、ruby-1.8以降が予定されている。
ソースコード中のm17n.c, m17n.hが該当個所。 内部的にはUTF-8として扱えるので、それを拡張すればいいか? UTF-8の処理への追加という形で実装できる?