こんにちは、sheepman です。

REXML を使って、Galeon のブックマークを弄ろうとしたんですが、
文字コードに関して問題が発生しました。

Galeon のブックマークでは、例えば「天気予報」という文字列は、
天気情報
という UTF8 の数値文字参照によって、保存されています。

REXML では数値文字参照があった場合、

rv.gsub!( /&#0*((?:\d+)|(?:x[a-f0-9]+));/ ) {|m|
  m=$1
  m = "0#{m}" if m[0] == ?x
  [Integer(m)].pack('U*')
}

のようなコードで pack して出力する文字列を生成しています。しかし、
pack('U*') は入力に UTF16な整数の配列を仮定して、UTF8な文字列を
出力するもので、XMLのエンコードはデフォルトでは UTF8なので、
おかしな文字列を REXML が出力してしまうように思えます。

本来は
- [Integer(m)].pack('U*')
+ [Integer(m)].pack('C*')
が正しいように思えます。

これって REXMLのバグなんでしょうか?
それとも Galeonのブックマークの問題か、
あるいは単に僕が勘違いしているだけなんでしょうか。

-- 
sheepman / TAMURA Takashi
sheepman / tcn.zaq.ne.jp http://www.tcn.zaq.ne.jp/sheepman/
Key fingerprint = 4E13 FE38 CD73 48D3 38AE  00EE 9E28 F98B D569 848E