成瀬です。

2011年2月21日22:50 Kouhei Sutou <kou / cozmixng.org>:
>  XMLDecl#encoding は String であるべき
>
> というよりは、
>
>  XML宣言に記述するエンコーディング(=情報交換用符号ですよ
>  ね?)と内部処理に使うエンコーディング(=内部処理用符号
>  =transcode ですよね?)を別々に管理できるようにするべき
>
> ですよね?

「別々に管理できる」に加えて、どのような名を名乗るかまで必要です。
で、Encodingを用いるとEncoding#nameを実際に記述するエンコーディング名に
用いると思いますが、この場合名前の正規化が走ってしまうのでまずいのです。
具体例としては 「csWindows31J」を用いたい時とか。

> で、別々にしないと困る例がUTF-16とUTF-32なんですよね。
> 当時のRubyにはUTF-16とUTF-32というEncodingがなかったので「情
> 報交換用符号」を表現できないからEncodingを使っちゃだめで、
> UTF-16とUTF-32に対応するためには代わりにStringを使うこと、と
> いうことだと認識しています。あっていますか?
>
> 今、trunkをみてみると、UTF-16/UTF-32というEncodingが追加され
> ていたので、「情報交換用符号」の表現としてEncodingを使えると
> 思っています。

というわけで、UTF-16 と UTF-32 は追加しましたがそれだけでは不十分なのです。

> それとは別に「内部処理用符号」を持つようにしようと思っていま
> す。名前はXMLDecl#transcode, XMLDecl#transcode=がいいんじゃな
> いかと思っています。これにもEncodingを使うつもりです。

内部処理用符号を持つことには賛成します。

けれども「transcode」はCRubyのエンコーディング変換エンジンの実装名で、
Rubyレイヤにはその名は出していないはずです。
よって、ここで「transcode」というメソッド名を用いるのは不適だと考えます。

私だったら長くても internal_encoding を使うかなぁ、IO とかでも使ってるので。

-- 
NARUSE, Yui  <naruse / airemix.jp>