文字と文字列

Kouichirou Eto 2003 @ eto.com
2003年 2月 12日 (水) 14:10:00 JST


江渡です。

文字、文字列問題で具体的にRuby/CHISEで悩んでる問題を書いてみます。

現在の実装では、StringとCharacterとにわかれています。

char = Character.get("字")
p char.ucs #23383

p "字".ucs #23383

前者が、Characterクラスを使用、後者がStringを使用。

しかし後者の実装がどうなっているかというと、Stringの先頭の文字(この場
合の文字とはUTF-8的に分割したところの最初の文字を)を元にCharacterクラ
スのinstanceをgetし(flyweightパターン使用)、それに対してucsメソッドを
出していると。

つまりここで後者で複数文字を指定するとどうなるか。

p "文字".ucs #25991

となる。つまり先頭文字の"文"だけが対象となる。

p "文字".ucs #[25991, 23383]

などというように、配列が返ってくるようにしようか? とも考えましたが、やっ
ぱりやめました。Characterに対して使えるクラスは、全てStringに対しても
使えるようにとか考えだすと、破綻しそうに思います。

今考えているのはむしろ、Characterのinstanceへの自動変換はやめて、
attributeにアクセスしたい場合は明示的にCharacterに変換するように
しようかと思います。つまりこのショートカットを廃止する。

ということで、"字"のucs値を知りたいときは、一旦それをCharacterに変換し
てからucsメソッドを実行するようにしようと思います。

p "字".char.ucs #23383
"字".charというのは、Character.get("字")の省略形。

このようにして、StringとCharacterとを分けて、使えるメソッドも
わけていこうと思います。

文字と文字列問題は、単にRuby、Perlからの問題ではなく、
C言語からlibchiseを使うためのAPIはどうするのかという問題でもあります。

> 『文字列』中の文字と『文字』を比較すると、前者は文脈を伴っているのに対
> し後者はそうでないということがいえると思います。“cat”の“a”と‘rat’
> の‘a’を比べた時に、両者を違うオブジェクトとして扱いたい場合に、その
> 環境が class があるオブジェクト指向言語だとすると、“a”と‘a’は『文
> 字』a のインスタンスだと考えられると思います。

Rubyの場合はflyweightパターンで、両者のaは同じインスタンスを指すように
してます。

> ところで、ちょっと違った問題かも知れませんが、私が疑問に思っている問題
> の一つに、文字列に付けられた属性と文字に付けられた属性は同一視できるか
> というものがあります。これは、XML でマークアップされたり Emacs Lisp の 
> text-property で付けられたような属性をその領域中の文字の属性と思って良
> いかということです。
> 
> 例えば、
> 
> 	<書体="明朝体">漢字</書体>
> 
> のようなものだと多分文字の属性と思っても良い気がします。言語とかでもそ
> うかも知れません。でも、
> 
> 	<コードネーム>漢字</コードネーム>
> 
> みたいにその文字列が不可分であるようなものだとその属性を文字列中の文字
> は継承しない気がします。
> 
> そして、もし、この仮定が真である、ないしは、そう考えた方が都合が良いこ
> とが多いならば、文字列の属性と文字の属性は区別した方が良い訳で、その場
> 合、必然的に『文字列』とは別な『文字』を導入した方が良いという結論にな
> る気がします。
> 
> ;; でも、実をいえば、この結論が正しいかどうかはあんまり自信がないです。

これは議論が混乱しているような気がします。
太田さん的に言えば、plain textにおける扱いにしぼるべきだと思います。

江渡 浩一郎 2003 @ eto.com






More information about the CHISE-ja mailing list