From: Martin Duerst Date: 2007-12-14T15:51:27+09:00 Subject: [ruby-dev:32591] Re: [ruby-cvs:21409] Ruby:r14172 (trunk): * transcode.c: new file to provide encoding conversion features. 中田さん、こんにちは。 At 04:01 07/12/13, Nobuyoshi Nakada wrote: >なかだです。 > >At Wed, 12 Dec 2007 19:39:46 +0900, >Martin Duerst wrote in [ruby-dev:32555]: >> 例えば "D\u00FCrst".encode('iso-8859-2') の文字コード変換 >> をテストしたいと思いますと、テストとして >> assert_equal("D\xFCrst".force_encoding('iso-8859-2'), >> "D\u00FCrst".encode('iso-8859-2')) >> ぐらいを書きます。しかし現在 encode は存在しない (けど >> 変換が可能) な Encoding を勝手に作るに対して、 >> force_encoding はそういうことを一切しないので問題になります。 > >たしかに。逆に、encodeを先にするとforce_encodingのほうもセットさ >れてしまいますね。 対処方法としてはいま次の様なことをやっています。 def setup all_encodings = [ 'ISO-8859-1', 'ISO-8859-2', 'ISO-8859-3', 'ISO-8859-4', 'ISO-8859-5', 'ISO-8859-6', 'ISO-8859-7', 'ISO-8859-8', 'ISO-8859-9', 'ISO-8859-10', 'ISO-8859-11', 'ISO-8859-13', 'ISO-8859-14', 'ISO-8859-15' ] all_encodings.each do |enc| 'abc'.encode(enc, 'UTF-8') end end これでテストがうまくいきますが、色々調べる内に 次の問題を見つけました: transcode.c で if (from_enc && to_enc && rb_enc_asciicompat(from_enc) && rb_enc_asciicompat(to_enc)) { if (ENC_CODERANGE(str) == ENC_CODERANGE_7BIT) return Qnil; } という部分がありますが、そこで「return Qnil;」にあたれば結果の文字列の Encoding は元の Encoding のままになっています。こちらで修正が できますが、そうすると中田さんがせっかく rb_str_transcode と rb_str_transcode_bang に refactor した部分をまだごっちゃになる 可能性が高いので、このあたりお願いできますでしょうか。 [これは、確実に Ruby から ENC_CODERANGE_7BIT にするやり方が分かりません からバグとして再現できているわけではありません。] 宜しくお願いします。 Martin. #-#-# Martin J. Du"rst, Assoc. Professor, Aoyama Gakuin University #-#-# http://www.sw.it.aoyama.ac.jp mailto:duerst@it.aoyama.ac.jp