ぽっくるのITざっき

IT関連技術についての覚え書きです。不定期更新です。

【Ruby】REXMLでの文字エンコーディング変換はしない?

2007-12-27 01:46:06 | Weblog
REXMLでXML文書を作成するときに、XMLDeclオブジェクトをDocumentオブジェクトにaddすることで、XML宣言を指定できる。

Rubyソース:
 require "rexml/document"
 include REXML

 doc = Document.new
 doc.add( XMLDecl.new( "1.0", "UTF-8" ) )
 ele = Element.new( "Test" )
 doc.add( ele )
 ele.add_text( "これはテストです。" )
 doc.write( $stdout )


このスクリプトを実行すると、次の結果XML文書が標準出力に書き出される。

結果文書:
<?xml version='1.0' encoding='UTF-8'?>
<Test>これはテストです。</Test>


XML宣言で文字エンコーディングを指定しているので、出力するときには指定のエンコーディングに変換されるのかと思ったが、どうもそうではないようだ。この結果文書をInternet Explorer6で表示すると、次のようなエラーが表示される。

テキストの内容に無効な文字が見つかりました。リソース 'file:///C:/TestEncoding.xml' の実行エラーです。ライン 1、位置 45


REXMLを使用してXML文書を作成する場合は、自分で文字エンコーディングを変換する必要があるようだ。以下のようにKconvモジュールを使用するとよいようだ。

Rubyソース(変換あり):
 require "rexml/document"
 require "kconv"
 include REXML

 doc = Document.new
 doc.add( XMLDecl.new( "1.0", "UTF-8" ) )
 ele = Element.new( "Test" )
 doc.add( ele )
 ele.add_text( "これはテストです。".toutf8 )
 doc.write( $stdout )


このスクリプトで生成されたXML文書はブラウザでも正しく表示された。


なお、この件についてはこちらのサイトで考察をされている。


【Rubyバージョン】1.8.6-p111-i386-mswin32
【OS】Windows XP Professional Edition + SP2