swfmillでFlash Lite 1のswfを扱えるようにしてみた
Flashに関連するオープンソースなツールのひとつに、swfmillがあります。swfmillは、swfファイルを解析してxmlファイルに変換したり、逆にxmlからswfファイルを生成することができるツールです。swfmillの使い方についてはいろいろなところで紹介されているので、ここではFlash Lite 1.xのswfファイルをswfmillで扱うときの問題点について紹介したいと思います。
日本語を含むFlash Lite 1.xのswfファイルをswfmill swf2xmlしてみたところ、"error : xmlEncodeEntitiesReentrant : input not UTF-8"というエラーメッセージがでて、xmlファイルの出力が途中で止まりました。この問題を調べてみたところ、以下のようなことがわかりました。
swf内の文字コード
FlashはVersion 6からUnicodeに対応しました。Unicode対応前と対応後でswfファイル内の文字エンコードが異なり、対応前はcp932(日本語の場合)、対応後はUTF-8になります。
そして、Flash LiteとFlashのバージョン間対応ですが、Flash Lite 1.xはFlash 4がベースになっており、Flash Lite 2.xはFlash 7がベースになっています。なので、Flash Lite 1.xで日本語swfの中の文字コードはcp932、Flash Lite 2.x以降のswf内文字コードはUTF-8となります。
swfmillとlibxml2
swfmillは、xmlの生成やパースにlibxml2を利用しています。そして、libxml2のDOM Document Treeでは、文字列は必ずUTF-8を利用することになっており、xmlの生成やパースの段階でエンコーディング変換を行うようになっています。
しかし、swfmillはswf内の文字列をそのままDOM Document Treeに格納しています。そのため、Flash Lite 1.xの日本語swfを読み込ませると、Document Tree内にcp932の文字列が入り込み、libxml2がxmlの生成に失敗してしまいます。
対策
swf内の文字列をDOM Document Treeに登録する際に、cp932からUTF-8への文字コード変換を行うように修正すると、問題なくFlash Lite 1.1のswfファイルを扱えるようになりました。また、XMLから文字列を読み込むときにUTF-8からcp932に変換すると、xml2swfで元の文字列がきちんと再現されたswfファイルが生成されました。
せっかくなので、コマンドラインオプションで"-e cp932"のようにswf内文字コードを指定できるようにしてswfmillのメーリングリストにパッチを送ってみたところ、今は次のリリースに向けた作業で忙しいけど後で時間のあるときにレビューするよと返事がありました。そのパッチをここにも載せておきますので、興味のある方はお試し下さい。上手く動かないの等問題があれば、フィードバックを頂けると幸いです。
swfmillのswf内テキストエンコーディング指定オプション追加パッチ
パッチ適用とビルドの仕方
swfmill-0.2.12のソースコードをダウンロード&展開 $ wget http://swfmill.org/releases/swfmill-0.2.12.tar.gz $ tar xzf swfmill-0.2.12.tar.gz $ cd swfmill-0.2.12 patchをダウンロードして適用 $ wget http://lab.klab.org/files/flash/encoding.patch $ patch -p1 < encoding.patch ビルドとインストール。適切なconfigureのprefixオプション等は 環境に合わせて適切に設定してください。 $ configure $ make $ make install
トラックバックURL
この記事へのコメント
トラックバックが弾かれちゃうので、コメントしてみました
まだこの手のことに関しては初心者です。失礼ながら教えてもらえないでしょうか?
コメントありがとうございます。
swfmillは、zlib, libpng, libjpeg, libfreetype, libiconv, libxml2, libxsltと、多くのライブラリに依存しています。
これらのライブラリを一つ一つVisual C++でビルドして行くのは大変なので、Unix系と似た開発環境をMinGW+MSYSかCygwinで用意するのが近道になります。
こちらでも試しにCygwinでビルドして見たところ、上の方で渡辺さんが紹介されているようにiconv引数の修正が必要になりますが、割と簡単にビルドすることができました。
コンパイル済みのバイナリと、依存するcygwinのdllをまとめたものを置いておきます。(とりあえず実行できる事は確認していますが、動作に関してはまったく確認していません)
http://lab.klab.org/files/flash/swfmill_cygwin.zip
頂いたcygwinのdllを使用し、ビルドすることができました。swfmillもちゃんと動いています。
困っていたところだったので、本当に助かりました。ありがとうございました。

