Siena. です。

▼ [ruby-list:35276] Yoshida Masato さん

》REXML::Source のほうは,UTF-16 のサロゲートペア対応,UTF-16(LE|BE)対応,UTF-32(|LE|BE)対応なども入れるべきでしょうが,今の段階ではこんなものでいいのではないでしょうか。

そうですね。まず、複数の文字エンコーディングを
ちゃんと扱えるようになってからで良いですよね。

》Iconv のラッパというのがいいと思いますが,iconv の実装に違いがありすぎてどうしようもないかもしれません。Solaris 2.6 以前の iconv のように UTF-8 に対応していないものもあるし,言語パッケージがインストールしてあるかどうかでも違うような。

変換できない (Uconv とか NKF とかの代替手段もない) 場合には
どうにもできませんから、例外を上げるしかないでしょうか。
XML 仕様的にも、処理できない時は fatal error とありますし。
えぇと、文字エンコーディング変換ライブラリで
標準添付になるものは、Iconv, NKF だけでしたっけ?
# 日本語だけなら、NKF と Uconv があればなんとか... ^^;

》REXML::Output は変換できない文字を全て文字参照に置き換えてしまいますが,要素名などを文字参照に置き換えるのはまずいでしょ

確かに困りますね。

変換できない場合は、例外を上げてしまうので良いですよね。
XML 仕様的には、読み込み時に文字エンコーディングが決定可能で
かつそれに違反する文字が出現した時には fatal error と
ありますから、逆に出力する場合も同様の扱いという事です。
これですと、利用側で別の文字エンコーディングに
変更してから retry してもらうというのも可能です。
少なくとも Iconv ですと、サポートしない変換が指定されたら
例外を上げてくる筈ですから、これに限れはそのままで良いですね。

一般化するならば、REXML::{Source,Output}#ext_encoding で
変換モジュールの存在をチェックするとかでしょうか。
ついでに、変換可能な文字エンコーディングか
調べる手段も用意できればベターだと思います。
とかいうのを、REXML::Encoding でやろうとしてました ^^;?
# 空だったので気になって ^^;

それとも、Output が文字エンコーディング指定を
utf-8 に上書きしてでも出力すべきでしょうか。

---
Siena. <mailto:siena / cr.chiba-u.ac.jp>