From: "U.Nakamura" Date: 2008-01-23T10:02:41+09:00 Subject: [ruby-dev:33287] Re: requests to transcode こんにちは、なかむら(う)です。 In message "[ruby-dev:33286] Re: requests to transcode" on Jan.23,2008 07:41:13, wrote: | stateful encoding を処理するは、ISO 2022 についてならば直前の escape | sequence というか、現在の文字集合番号とバイト列があればよいかと。ここで | 1 byte をブロックに渡すか、多バイト必要な場合なことを考えて複数バイト渡 | すか、いっそのことバイト列すべてと現在の index を渡すかが迷いどころです | かねぇ。 あんまりたくさんブロックに引数を渡すようにしても書き間違える だけなので、成瀬さんの2つ目の案のように2個程度に留めるか、情 報をまとめたクラスのインスタンスを1個渡すか、どちらかが現実的 でしょうね。 とりあえず後者にしておけば後で仕様を追加できるので、実装する 方は気が楽かもしれません。 | > フラグを使う例だと、変換不能な文字を任意の指定文字に置換する | > ことはできないような気がしますが、例えばスレッドローカルな特 | > 殊変数で指定するとかいうことを考えておられますか? | | エンコーディングごとにデフォルトの置換文字が決まっているので、通常はそれ | を用いればいいかと。変えたい場合はブロックで。ハッシュなりで渡すという方 | 法もあるでしょうね。 「決まってる」というのは、何で決まってるんでしょう? # 不勉強ですみません ブロック渡せるようになればどうにでもなるので、そういう方向だ ということが決まるのなら、使う方としてはあまり気にはなりませ んけどね。 | > 変換元Cバイト配列、変換元encoding、変換先encoding、変換失敗時 | > 対応方法、というような引数で呼べると嬉しいです。 | > 変換失敗時対応方法として、エラー、指定文字に置き換え、のいず | > れかを選べ、エラー時には例外でなく戻り値で示してもらえると嬉 | > しいですね。 | | 思うに mbsrtowcs 的な API についての話だと思います。 ああ、いや、なんというか、単に rb_funcall(str, rb_intern("encode"), 1, enc); と書かずに直接rb_str_transcode()相当を呼びたかっただけという だけです。 ただしrb_str_transcode()そのものはrubyインタプリタ評価器から 呼ばれること前提なので、argvをばらした状態で呼べるものが欲し いな、というそれだけ... 変換失敗時対応方法という引数があるといいというのは、String#encode 自体がそういう方向になるはずなので、というだけです。 といわわけで、戻り値はVALUE(String)でいいですし、失敗はnilで 教えてくれればもう十分で、呼んだ側は失敗してたら後は死ぬなり 何なりすればいいやと思っていたので失敗したところから再開とか は全然考えていませんでした。 | 勉強不足なせいでこれで十分かわかりませんが、たぶん大体こんな感じでしょうか。 十分というか、鼻血が :) 私としてはここまで生なものが欲しかったわけではなくて、上述の 通りです。 成瀬さんの案は、String#encodeのブロック引数つき版に対応したAPI ということになるかと思うのですが、これはまあこれとして、私が 欲しかったのはもっと手軽に呼べるシンプルな奴です、はい。 それでは。 -- U.Nakamura