- 2006-01-22 (日)
- FlashMind
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(/([[: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メソッドをオーバーライドすれば、直せるのかな。
まあいいか。とりあえず先に進みます。
- Newer: やっと、表示系の基本が完成
- Older: フォーシーズンズホテル
Comment:0
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を使った実体参照の読み込みを興味深く読ませていただきました。勉強になりました。