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