From: Yukihiro Matsumoto Date: 2008-09-16T13:09:21+09:00 Subject: [ruby-dev:36319] Re: 合成文字の2コードポイント目 まつもと ゆきひろです In message "Re: [ruby-dev:36318] Re: 合成文字の2コードポイント目" on Tue, 16 Sep 2008 12:50:08 +0900, Tanaka Akira writes: |> |UTF-8-CODEPOINT とかを導入するのがいいのではないかと思ってい |> |ます。 |> |> もうちょっと良い名前が欲しい気もします。自分では思いつかない |> んですけど。 | |まぁ、いい名前が見つかったらでいいんじゃないでしょうか。 了解です。 |rb_enc_mbclen がコードポイント単位ではなくなっているので、そ |のままでは動きません。 実際にはrb_enc_codepoint()とrb_enc_codelen()の組み合わせにし てさきほどコミットしました。 |rb_enc_codepoint でなく、rb_enc_mbc_precious_codepoint を使っ |て、長さを得る必要があります。valid でないものを途中で見つけ |たら例外ですかね。 えーと、この辺の関数名の働きがよく分かってないんですが、 rb_enc_codepoint()はもう使えないんですか。この場合、 rb_enc_codepoint()とrb_enc_mbc_precious_codepoint()との違いは なんなんでしょう? (precious → precise?) |あー、String#codepoints なんてものが入っているんですね。これ |は? 同じメソッドの別名です。each_codepointの方はブロックを与えて 繰り返すことを主眼に、codepointsの方はEnumeratorを得ることを 主眼にしている名前です。 |> これは文字クラスの両端はコードポイントに直接対応する「文字」 |> しか来ることができないという意味でしょうか。仮にそうだとする |> と、正規表現リテラル/[○-●]/の「まる」のいずれかが合成文字 |> であった場合にはエラーになりますか? | |エラーにはなりません。濁点などが無視されます。 | |% ./ruby -e 'p /[\u{30BB 309A}-\u30BF]/ =~ "\u30BB"' |0 | |U+30BB U+309A は「セ」と合成用半濁点で、アイヌ語のカナ表記で |使う文字です。それが「セ」にマッチします。 | |エラーにしたいのであれば oniguruma 側に検査を入れることにな |ります。コードポイントを得ているところで、文字の長さとコード |ポイントの長さが等しくなければ、というような条件になります。 別にエラーにしたいわけではありませんから、わざわざチェックを 入れる必要はないのではないかと思います。ただ、やや自明ではな い気がします。まあ、 |そのうち、/[\u{30BB 309A}\u30BF]/ は /\u{30BB 309A}|[\u30BF]/ |に変換する処置をいれるべきかもしれません。そのへんの話は |Unicode TR #18 に書いてあるので、気が向いたら。 |http://unicode.org/unicode/reports/tr18/ ということなので、おいおい進化すればいいのかもしれません。 まつもと ゆきひろ /:|)