Home > FlashMind > ActionScriptを使った実体参照の読み込み

ActionScriptを使った実体参照の読み込み

ActionScriptで文字実体参照を使ったXMLファイルを読み込むと正しくエンコードされない不具合にハマっておりました。

そもそも、FreeMindはXMLファイルを保存するときに日本語の文字列を実体参照として保存しています。
たとえば、"あ"という文字は、UTFの実体参照である"あ"として保存されているのです。
しかし、このデータをActionScriptのXMLオブジェクトを使って読み込むと、"0B"となってしまいます。

ためしにActionScript内で以下のコードを書いた場合は、正しくエンコードされるのに。

trace(String.fromCharCode(new Number("0x3042"))) ;//"あ"が出力される

読み込んだ時点で"0B"になってしまうので、自前でエンコードしようにもできない状況。
せめて、rawデータのまま読み込めれば上の方法を使ってなんとかなりそうなんですが。

結局、Flash上でエンコードすることはあきらめ、サーバ側で実体参照をエンコードする方式を採用。
急遽、Rubyで以下のようなcgiを作成して、エンコード済みのXMLファイルを出力するようにしました。

#!/usr/local/bin/ruby -Ku
print "Content-type: text/xml;charset=utf-8\n\n"
require "cgi"
require 'nkf'
cgi = CGI.new

if cgi['file'] != ""
file=cgi['file']
log=""
fh=open(file)
fh.each{|l|
print l.gsub(/&#x([[:xdigit:]]+);/){[$1.hex].pack("U")}
}
fh.close
end

上記cgiのfileパラメータにエンコードしたいxmlファイル名を入力すると、実体参照を展開したXMLファイルが出力されるので、その結果をFlashから取得しています。
(※上記cgiには、DocumentRoot以外のファイルでも参照できてしまう脆弱性が含まれています。現在稼動しているcgiでは、解決しております。)

ちなみに、上記cgiの12行目、.pack("U")の引数を"v"に変更した場合、"あ"ではなく"0B"が表示されました。
おっと。これはActionScript上で出た文字列と一緒。
てことは、ActionScript上ではunsigned shortでpackされちゃってるってことですかねぇ。

既存のXMLオブジェクトのloadメソッドをオーバーライドすれば、直せるのかな。
まあいいか。とりあえず先に進みます。

Comment:0

Comment Form
Remember personal info

Trackback:1

TrackBack URL for this entry
http://www.plants-web.jp/mt/mt-tb.cgi/123
Listed below are links to weblogs that reference
ActionScriptを使った実体参照の読み込み from Flashマインドマップ開発ブログ
PCトラブル from はろーねっと 2006-04-16 (日) 19:46
こんにちは。Flashマインドマップ開発ブログ: ActionScriptを使った実体参照の読み込みを興味深く読ませていただきました。勉強になりました。

Home > FlashMind > ActionScriptを使った実体参照の読み込み

Search
Feeds

follow hal_sk at http://twitter.com

Page Top