From: nobu.nakada@... Date: 2002-04-17T16:29:41+09:00 Subject: [ruby-dev:16940] Re: ライブラリ拡大計画 なかだです。 At Wed, 17 Apr 2002 15:21:07 +0900, Tanaka Akira wrote: > > successは残します。succeededじゃないかという気もそこはかとなく > > するのですが。 > > ふと、converted というのが頭に浮かびました。 うーん、どうしたものか。そしたらfailedじゃなくてrestとかになる ような。全部aliasしとこうかなぁ。 > > ただし、Iconv#closeやIconv#iconvで発生するときもIconv.iconvに合 > > わせてArrayにしようかと思ってます。まだ決めかねてますが。その他 > > では、Iconv::Failure#sourceとIconv::Failure#posを追加するつもり > > です。#sourceは入力のArray、#posはsource[0]で変換が停止した位置、 > > つまりfailed == source(0)[pos..-1] if source(0)になります。 > > ふたつめ以降の文字列で問題が起きた場合にはどうなりますか? > 現在だと、 > > % ruby -riconv -e 'Iconv.iconv("US-ASCII", "EUC-JP", "a", "b\xa1\xa1") rescue p $!' > # > > というようになる場合です。 success, failedは同じ、source = ["b\xa1\xa1"], pos = 1になりま す。 > # うぅむ。ここで MIME charset が使えるのは現実的にはとても便利だ... それはたぶんiconvの実装に依存します。 > > > ちなみに、変換できない文字を(XML の)文字参照にするというのに使ったので > > > すが、コード自体は短いくせにかなり厄介でしたね。 > > > > どういう風に厄介でしたか。 > > begin > @out << @iconv.iconv(str) > rescue Iconv::IllegalSequence => err > @out << err.success > ch, str = err.failed.split(//, 2) > ch = @iconv_to_utf8.iconv(ch) if @iconv_to_utf8 > @out << @iconv.iconv("&##{ch.unpack('U')};") > retry > end > > というコードを書いたんですが、 > > * ふたつの Iconv オブジェクトの状態変化を正しく扱っているかどうかを確 > 信するのが難しい。 ステートフルな入力だと芳しくないような気がします。たぶん一つの 入出力に対して複数のiconvを使うのは、iconvの仕様上無理があると 思います。シフトステートに対する操作はリセットだけで、退避して おいたりすることはできませんから。文字参照を使うことを前提にす るなら、むしろ一度UCS-4にしてしまったほうがいいかも。 > * retry でループを構成する必要がある。 一応異常系なのでしょうがないという気もするのですが。まぁ他に手 を思い付かなかったというだけなので、もっといい方法があればそう します。 > * unpack が期待通りに動かなかった。 これはよく分からないんですが。というか、iconvの問題ですか。 -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦