Ruby/UTF-2000

Ruby/UTF-2000とはなにか

Ruby/UTF-2000は、XEmacs UTF-2000実装におけるUTF-2000モジュール、
CHISEモジュールのRubyへの移植を試みたモジュールである。

■UTF-2000モデルとはなにか

UTF-2000モデルとは、文字を符号ではなく属性によって扱う方法を意味する。

Ruby/UTF-2000ではそれを拡張し、文字をオブジェクトとして扱っている。

■download

■使い方

■全体的な使い方

require 'utf2000'
include UTF2000

char = Character.new("字") #UTF8で与えること
puts char

■class Characterの使い方

char = Character.new("字") #UTF8で与えること
p char.ucs #とすると、その文字のucsの値が表示される
p char.total_strokes #などの属性もある
p char.chinese_gb2312 #などなど
char.alist.each {|a, v| #こんな感じで全属性を表示できる
  print a, ': ', v, "\n"
}

■XStringの使い方

xstr = XString.new("文字列") #こんな感じで初期化します。UTF-8で与える。
xstr = "文字列".to_x #こんな拡張方法も用意してある。こっちのほうがきれい。
str = xstr.to_s #もちろんこうやると元に戻る。
#しかし戻った文字列が元の文字列とidenticalである保障はいまのところない。可能なのか?
puts xstr #とすると、to_sが内部的に呼ばれて、普通のUTF-8の「文字列」が出力される。
p xstr #inspectが内部的に呼ばれて、それは各Characterについての情報が表示される。
p xstr.inspect_all #とすると、持っている情報を全て表示する。

■様々な用例案

下記のような文章を入力、表示できるようになることを例として考える。

■説明

まじめなメソッドの説明を書く。(未完)

class XString

class Character
	get_char_attribute
	get
	[]

■悩みどころ

いろいろ悩みどころがあるのですが、適当に書いてみます。

Ruby/M17Nとの整合性はどうとればよいか?
現在、XStringとCharacterの組み合わせで実装しているが、 Ruby/M17NではStringだけで完結している。XStringの機能をStringに もっていくとして、Characterの機能はStringに実装するか、今のまま Characterというクラスとして実装するか。
現在はXStringとCharacterの二段構えになっているが、Stringに一本化す るのがいいのではないか。
XStringは外部からはStringに見え、内部的にはCharacterのArrayとして 実装されている。この実装は非常に素直であるが、しかしRuby/M17Nでの実装 方法とは食い違っている。XStringはArrayであり、byte列が規定されていない などの問題がある。この二段構え構造を排し、String一本に集約させるという 方法もあるはずで、最終的にはこの方法へと集約させたい。
iso-2022へのencodeはどう実現すればよいのか?
Characterはどうencodeするかの属性を持っていて、 XStringはその実際のencodeの処理を行うという分離でいいかな。
iso-2022-jpの処理はどうすればいいのか?
iso-2022-jpは行末ではASCIIに戻すという行単位の扱いが必要になるが、 XStringの中からはその判断はできない。 class IOを拡張するのがいいのか?
存在しないattributeを参照したときは?
現在はnilを返しているが、例外をraiseするほうがいいのか?

■字形合成を巡る悩みどころ

"+木木"(+はU+2FF0を意味する)という文字列があるとして、 しかしこれは実は"林"という一文字を表しているわけだ。 この二重性をどう取り扱うか?
newされた時点で問答無用で"+木木"を"林"というCharacter一文字に変換 してしまうと、その時点で区別ができなくなってしまう。つまり必要に応じて composeするべきである。しかしその必要に応じてというのはどのように判定 すればいいのだろうか?
もしエラーが含まれていた場合は?
"+木".to_x.compose_ids とした場合は? 一文字しか無いので、処理方法が無い。 これは例外をraiseするか、元の文字列をそのまま返すか、悩みどころである。
もし文字が存在しなかった場合は?
"+林林"とかした場合は、木が横に四つ並んでる漢字は存在しない、と思うので、 これはまた同様に、例外とするか、元の文字列をそのまま返すか悩みどころである。 どちらにせよ、どの文字コード体系にも存在しないような文字を表示できる 字形合成エンジンが世界のどこかにあると仮定して、そのエンジンに手渡される までは、情報が失われないように処理するべきである。

■Ruby/M17N

Ruby/M17Nはすでにできているらしく、それとの整合性をどうとればいいか。

Ruby/M17Nブランチが本体に反映されるのは、ruby-1.8以降が予定されている。

ソースコード中のm17n.c, m17n.hが該当個所。 UTF-2000は内部的にはUTF-8として扱えるので、それを拡張すればいいのか? UTF-8の処理への追加という形で実装できる?

■link

Kouichirou Eto, 2003 at eto.com