add to_euc, to_sjis
[chise/ruby.git] / doc / index.html
1 <html>
2 <head>
3 <title>Ruby/CHISE</title>
4 <link rel="stylesheet" type="text/css" href="style.css">
5 </head>
6
7 <body>
8 <div class="center">
9
10 <h1><span class="e">Ruby/CHISE</span></h1>
11
12 <div class=linkbox>
13 <a href="#download">download</a>,
14 <a href="#install">install</a>,
15 <a href="#howto">howto</a>,
16 <a href="#links">links</a>
17 </div>
18
19 <div class="w40em">
20
21 <div class=box>
22 <h2>■<span class="e">Ruby/CHISE</span>とはなにか</h2>
23 <p>Ruby/CHISEは、XEmacs CHISEにおけるChaon実装を<br>
24 Rubyへ移植することを試みたモジュールである。<br>
25
26 <h3>■Chaonモデルとはなにか</h3>
27
28 <p>Chaonモデルとは、文字を符号ではなく属性によって扱う方法を意味する。
29 <p>Ruby/CHISEではそれを拡張し、文字をオブジェクトとして扱っている。
30
31 </div>
32
33 <div class=box>
34 <a name="download"></a>
35 <h2 class="e">■download & history</h2>
36 <ul>
37 <li>2003-0110   テスト公開
38 <li>2003-0112   XString追加
39 <li>2003-0115   IDSの読み込み機能β版
40 <li>2003-0116   IDSの読み込み機能1.0
41 <li>2003-0117   XStringを廃止し、Stringに一本化。IDSの読み込み機能を強化。
42 <li>2003-0120   IDS_Treeの読み込み機能を追加。木構造の整合性checkを追加。
43 <li>2003-0130   IDSの逆変換機能などを追加。
44 <li>2003-0213   <a href="http://eto.com/2003/ruby/ruby-chise-20030213.tar.bz2" class="s">ruby-chise-20030213.tar.bz2</a><br>
45 名称をRuby/UTF-2000からRuby/CHISEへと変更。
46 </ul>
47 <hr>
48 <h3>■CVS</h3>
49 <p><a href="http://cvs.m17n.org/cgi-bin/viewcvs/ruby/?cvsroot=chise">CVS access</a>
50 <hr>
51 <h3>■libchise version</h3>
52 <p>libchiseを使用したversionを作成中です。現在はプレアルファ版です。<br>
53 <a href="http://eto.com/2003/ruby/rbchise-20030309.tar.bz2" class="s">rbchise-20030309.tar.bz2</a><br>
54 </div>
55
56 <div class=box>
57 <a name="install"></a>
58 <h2 class="e">■install</h2>
59 <p>展開して、<b>make install</b>する。
60 <p>通常、<b>/usr/local/lib/ruby/site_ruby/</b>以下にinstallされる。
61
62 <hr>
63 <h3 class="e">■config</h3>
64 <p><b>src/chise.rb</b>内
65 <p><b>DB_DIR = '/usr/local/lib/xemacs-21.4.10/i686-pc-linux/char-db'</b><br>
66 必要に応じて変更する。
67 <p><b>IDS_DB_DIR = '/home/eto/work/chise/ids/''</b><br>
68 IDSのテキストファイルが置かれているディレクトリーを指す。(下記の字形分解・合成についてを参照)
69
70 <hr>
71 <h3 class="e">■依存関係</h3>
72 <p>下記のパッケージが必要。
73 <ul>
74 <li><a href="http://www.sleepycat.com/" class="b">db3-3.2.9</a>
75 <li><a href="http://www.ruby-lang.org/~eban/ruby/binaries/mingw/ext/" class="b">bdb-0.3.6</a> (bdb-0.3.8などそれ以上でも可)
76 <li><a href="http://www.yoshidam.net/Ruby_ja.html#uconv" class="b">uconv-0.4.11</a>
77 <li><a href="http://www.ruby-lang.org/ja/" class="b">ruby 1.6.7</a> これはRuby本体。
78 </ul>  
79
80 <p>一般にRubyのパッケージは
81 <a href="http://www.ruby-lang.org/raa/"><b>RAA</b></a>を使って探すことができる。
82
83 <hr>
84 <h3 class="e">■Unicode</h3>
85 <p>現状では、Ruby/CHISEに渡す文字コードはUTF-8のUnicodeにしておくと便利である。
86 <p>これは望ましいものではなく、将来的にはプログラム自体がSJIS、EUCなどで書かれていても
87 問題なく処理できるようにする予定である。
88 <p>WindowsでUnicodeを使えるエディターとして、私はMeadow + Mule-UCSを使っている。
89 <p>他、Windows付属のメモ帳を使うことができる。
90 <p>また、見るだけであればIEに落すと表示される。
91 <p>フリーのUnicode対応エディターとして他にYuditがあるが、まだよく使い方はわからない。
92 </div>
93
94 <div class=box>
95 <a name="howto"></a>
96 <h2>■使い方</h2>
97 <p>
98
99 <h3>■全体的な使い方</h3>
100 <pre>
101 require 'chise'
102 include CHISE
103
104 str = "字" #Stringを拡張している。UTF8で与えること。
105 p str.ucs #とすると、その文字のucsの値が表示される
106 p str.total_strokes #画数が表示される
107 p str.chinese_gb2312 #などなど
108 str.char.alist.each {|a, v| #こんな感じで全属性を表示できる
109   print a, ': ', v, "\n"
110 }
111 p str.inspect_x #Characterについての情報が表示される。
112 p str.inspect_all #持っている属性情報を全て表示する。
113
114 str = "文字列" #もちろん一文字でなく文字列も扱える。UTF-8で与える。
115 p str.inspect_x #各文字の情報が表示される。
116 p str.inspect_all #各文字の属性情報を全て表示する。
117 </pre>
118
119 <hr>
120 <h3>■様々な用例案</h3>
121 <p>下記のような文章を入力、表示できるようになることを例として考える。
122 <ul>
123 <li>「電話は中国繁体字だと電話と書き、中国簡体字だと電話と書く」
124 <li>「吉野屋の吉は、土吉の吉である。」
125 <li>「高橋さんは高橋さんと表記されるのを嫌う。」
126 <li>「日本語の骨を、中国簡体字だと骨と書く」
127 </ul>
128 <p>が、まだ入力できません。未完成です。
129 </div>
130
131 <div class=box>
132 <h2>■字形分解・合成</h2>
133 <p>Ruby/CHISEは、もともと字形分解・合成を扱うために作られたため、その機能が強化されている。
134
135 <p>字形分解・合成は、現在はUnicodeにおけるIDS(Ideographic Description Structure)という仕様に準拠している。
136 U+2FF0〜U+2FFBで表わされるIDC(Ideographic Description Characters)によって合成方法を指定し、
137 これに続く二文字から三文字の文字を合成して表示する。
138
139 <p>これは元々必要な漢字が文字コードに無い場合にその代替物として表記するために考えられた仕様だ。
140 もし文字表示機能が字形合成に対応している場合は、その合成された字を表示する。
141 もし字形合成の機能が無い場合は、IDC自体を目に見えるように表示し、
142 ユーザーの想像力に任せることになる。
143
144 <p>実際のところ、IDSを使った字形合成機能を持つ文字表示エンジンが存在するとは聞いたことがない。
145 そのため現状ではこの仕様は絵に書いた餅になっている。
146
147 <p>ここではその仕様を転用し、漢字の字形を指示するために使っている。
148
149 <p>ちょっと想像してみればわかるが、IDSはまともな実装が存在していないことからもわかる通り、
150 普通には使えない仕様である。実際に漢字の字形を合成して表示するといっても、
151 縦とか横につらなるなどといった単純な情報だけでは不十分で、もっと多様な情報が必要である。
152 部品間の大きさのバランスなど、ついheuristicな方法で対処できるのではないかと考えてしまいがちだが、
153 実際に見ておかしくない字を作るためには現状ではまだ人手によってデザインする必要がある。
154 ここではその仕様を転じて、字形の成立ちを説明するために使っているが、
155 このような使い道なら使えるようだ。
156
157 <hr>
158 <h3 class="e">■IDSを使うための準備</h3>
159
160 <p>下記のようにして、IDSのテキストファイル群を持ってくる。
161 <pre><small>% cd ~/work/chise (このディレクトリーは適宜変更する)
162 % cvs -d :pserver:anonymous@cvs.m17n.org:/cvs/root login
163 password: (何も入れずにただもう一度return)
164
165 % cvs -d :pserver:anonymous@cvs.m17n.org:/cvs/chise co -d ids ids
166 </small></pre>
167
168 <p>このようにすると、IDSのテキストファイル群を持ってくることができる。
169
170 <p>その後、<b>src/chise.rb</b>内<br>
171 <b>IDS_DB_DIR = '/home/eto/work/chise/ids/''</b><br>
172 ここに、上記のIDSテキストファイル群を持ってきたディレクトリーを入れる。
173 必要であれば、再度<b>make install</b>する。
174 このようにして適切に<b>IDS_DB_DIR</b>を設定し、
175 <b>./tools/idsdbdumpall.rb</b>を実行する。(かなり時間がかかる)
176 これで、文字属性として新たにids, ids-decomposeが加わった。
177 それぞれ、IDSの文字列、それを再帰的に分解しきったものを意味する。
178
179 <p>実用上は差し支えない範囲だが、IDSテキストファイルにはまだ入力されて
180 いない字もある。<b>./tools/idscheckintegrity.rb</b>を実行する(かなり時
181 間がかかる)と、IDSの木構造の整合性をチェックし、整合性がとれていない字
182 を表示する。
183
184 <hr>
185 <h3 class="e">■字形分解</h3>
186 <p>Stringに、decompose, decompose_allという二つのメソッドがある。
187 decomposeは一段階だけ分解する。decompose_allはそれを再帰的に行う。
188 <pre>
189 p "字".decompose
190 p "字".decompose_all
191 p "榊".decompose
192 p "榊".decompose_all
193 p "終了".decompose
194 p "終了".decompose_all
195 p "鬱".decompose
196 p "鬱".decompose_all
197 </pre>
198
199 <p>最初の説明から、字形分解されて出てきた結果の文字列には、
200 IDSキャラクターが含まれているため、場合によってはうまく表示されない。
201 メモ帳だと表示できるだろう。
202
203 <hr>
204 <h3 class="e">■字形合成</h3>
205 <p>分解の逆に合成することもできる。ことにしようと思っているが、まだできていない。
206 <!-- 逆変換、compose機能はまだできていない。-->
207
208 </div>
209
210 <div class=box>
211 <h2>■説明</h2>
212 <p>まじめなメソッドの説明を書く。(未完)
213 <pre>
214 class String
215         char    先頭の文字をCharacterに変換したものを返す
216 →method_missingで、存在しないmethodを指定すると、自動的に先頭の文字を
217 Characterに変換してそれへのmethodとして呼ぶ。
218
219 class Character
220         get     ある文字をgetする。(flyweightパターン)
221         []      ある属性をgetする。get_char_attributeも使える。
222                 またmethod_missingも使える。
223         []=     ある属性をputする。put_char_attributeも使える。
224                 またmethod_missingによる入力も使える。
225 存在しない属性を参照したときは、nilが返る。
226 </pre>
227
228 <hr>
229 <h3>■tools</h3>
230 <p>詳しくは<b>tools/README</b>を参照。
231 <ul>
232 <li><b>dbdumpall.rb</b>, char-dbのBDBファイル群の中身をテキストとして展開する。
233 <li><b>idsdumpall.rb</b>, IDSのテキストファイル群を読みこみ、BDB化する。再帰的に展開したids-decomposeも作る。
234 <li><b>idscheckintegrity.rb</b>, IDSの木構造の整合性をチェックする。
235 <li><b>mkdbtarball.rb</b>, UNIXで作ったBDBファイル群をWindowsに持っていくときに使う。
236 Windowsでtar.gzを展開するには、<a href="http://member.nifty.ne.jp/beambitious/">eo</a>がおすすめ。
237 <li>trim_bom.rb, Unicodeファイルを作ったときの先頭についてくるBOM(byte order mark)を削除する。
238 </ul>
239 </div>
240
241 <div class=box>
242 <h2>■悩みどころ</h2>
243
244 <dl>
245 <dt>iso-2022へのencodeはどう実現すればよいのか?
246 <dd>Characterはどうencodeするかの属性を持っていて、
247 XStringはその実際のencodeの処理を行うという分離でいいかな。
248
249 <dt>iso-2022-jpの処理はどうすればいいのか?
250 <dd>iso-2022-jpは行末ではASCIIに戻すという行単位の扱いが必要になるが、
251 XStringの中からはその判断はできない。
252 class IOを拡張するのがいいのか?
253 </dl>
254
255 <hr>
256 <h3>■字形合成</h3>
257 <dl>
258
259 <dt>"+木木"(+はU+2FF0を意味する)という文字列が
260 あるとして、しかしこれは実は"林"という一文字を表している。
261 この二重性をどう取り扱うか?
262 <dd>newされた時点で問答無用で"+木木"を"林"というCharacter一文字に変換
263 してしまうと、その時点で区別ができなくなってしまう。つまり必要に応じて
264 composeするべきである。しかしその必要に応じてというのはどのように判定
265 すればいいのだろうか? 明示的に指定するしかないということか。
266
267 <dd>Unicode対応のeditorはどうとりあつかっているのだろうか?
268 Unicodeの規定によれば、このIDSによって指定された文字列は、合成された文字そのものを
269 表すと規定されている。合成された文字を表示可能である場合は、IDS自体を表示してはいけない。
270 逆に合成した文字を表示できない場合は、IDS自体を見えるように表示しないといけない。
271 とすると、Unicode対応のeditorが適切な文字合成の機能を持っていた場合、
272 それは合成された結果の文字を表示するのがいいのか? 合成される前の文字列を
273 表示するのがいいのか? 結局ユーザーが明示して切り替えられるようにするのがいいのか?
274
275 <dt>もしエラーが含まれていた場合は?
276 <dd>"+木".to_x.compose_ids
277 とした場合は、オペレータの対象が一文字しか無いので、処理できない。
278 これは例外をraiseするか、元の文字列をそのまま返すか、悩みどころ。
279
280 <dt>もし文字が存在しなかった場合は?
281 <dd>"+林林"とかした場合は、"木"が横に四つ並んでる漢字は存在しない(と思う)ので、
282 これも例外とするか、元の文字列をそのまま返すか悩みどころ。
283 どの文字コード体系にも存在しないような文字を表示できる字形合成エンジンがあると
284 仮定して、そのエンジンに手渡されるまでは、情報が失われないように処理
285 するべきである。
286
287 <dd>また、本来Chaonモデルはこのような「存在しない文字」をとりあつかえるように
288 するためのモデルなので、こういった文字もシームレスに扱えるようにするべきである。
289 しかしどのようにすればいいのかわからない。
290
291 </dl>
292
293 <hr>
294 <h3 class="e">■Ruby/M17Nとの整合性</h3>
295 <p>Ruby/M17Nとの整合性をどうとればいいか。
296 <ul>
297 <li><a href="http://www.inac.co.jp/~maki/ruby/ruby-i18n.html">M17N/I18N for Ruby</a>
298 <li><a href="http://www.inac.co.jp/~maki/ruby/matz-000516.html">Matz によるI18Nに関するコメント(2000/05/16) </a>
299 <li><a href="http://ns1.php.gr.jp/pipermail/php-dev/2002-April/000274.html">高橋征義氏による、Ruby M17Nの解説</a>
300 <li><a href="http://cvs.ruby-lang.org/~knu/cgi-bin/cvsweb.cgi/ruby/?only_with_tag=ruby_m17n">Ruby/M17N</a>
301 </ul>
302
303 <p>Ruby/M17Nブランチが本体に反映されるのは、ruby-1.8以降が予定されている。
304
305 <p>ソースコード中のm17n.c, m17n.hが該当個所。
306 内部的にはUTF-8として扱えるので、それを拡張すればいいか?
307 UTF-8の処理への追加という形で実装できる?
308
309 </div>
310
311 <div class=box>
312 <a name="links"></a>
313 <h2 class="e">■links</h2>
314 <p>
315 <h3 class="e">■CHISE project</h3>
316 <ul>
317 <li><a href="http://cvs.m17n.org/chise/">CHISE project</a>
318 (<a href="http://www.kanji.zinbun.kyoto-u.ac.jp/projects/chise/">kyoto-u</a>,
319 <a href="http://mousai.as.wakwak.ne.jp/projects/chise/">mousai</a>)
320 <li><a href="http://cvs.m17n.org/chise/ruby/index.html.ja.iso-2022-jp">Ruby/CHISE page at CHISE project</a>
321 <li><a href="http://cvs.m17n.org/cgi-bin/viewcvs/perl/?cvsroot=chise">師茂樹氏 Perl/CHISE → CHISE.pm</a>
322 </ul>
323
324 <h3 class="e">■Ruby</h3>
325 <ul>
326 <li><a href="http://www.ruby-lang.org/ja/">Ruby</a>
327 <li><a href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/11450">akr氏によるRuby/CHISE仕様案</a>
328 <li><a href="http://moulon.inra.fr/ruby/bdb.html">Ruby/BDB</a>
329 <li><a href="http://www.ruby-lang.org/~eban/ruby/binaries/mingw/ext/">eban氏によるコンパイル済みの拡張ライブラリー</a>
330 </ul>
331 </div>
332
333 </div>
334
335 <address><a href="http://eto.com/"><span class="white">Kouichirou Eto</span></a>, 2003 at eto.com</address>
336
337 </body>
338 </html>