mxmlc とか flash のログを tail すると文字化けする問題

mxmlc で swf をコンパイルしているときに出てくる warning や、AS で trace した文字が文字化けしちゃう問題について。

まずは mxmlc について。こいつは java をつかってコンパイルしているらしい。これがどうやら Mac のデフォルトでは SJIS で出力しちゃうっぽい。Mac というか、java のデフォルトかな。なんで、java を実行するときに -Dfile.encoding=UTF8 っていうオプションをつけてあげなきゃいけない。下記のURLが参考になった。
http://un-q.net/2006/12/macmxmlc.html
詳しく手順を説明すると、mxmlc は FlexSDK の bin の中、FlashBuilder をインストールしたのなら /Applications/Adobe Flash Builder 4.0/sdks/4.1.0/bin あたりにはいってる。この mxmlc を直にいじればいいようだ。
まずはディレクトリに移動して、mxmlc を vi でひらく。怖い人はバックアップをとること。

$cd /Applications/Adobe\ Flash\ Builder\ 4.0/sdks/4.1.0/bin
$vi mxmlc

んで、その中に

java $VMARGS $D32 $SETUP_SH_VMARGS -jar "$FLEX_HOME/lib/mxmlc.jar" +flexlib="$FLEX_HOME/frameworks" "$@"

とかっていう行があるので、そこに

java -Dfile.encoding=UTF8 $VMARGS $D32 $SETUP_SH_VMARGS -jar "$FLEX_HOME/lib/mxmlc.jar" +flexlib="$FLEX_HOME/frameworks" "$@"

みたいにオプションを加えるだけ。
bin フォルダに入ってるからてっきりコンパイル済みのバイナリなのかと思ってたけど、ただのスクリプトファイルなのね。




次に、trace が文字化けちゃう問題について。FlashBuilder とかで trace 見てれば問題ないのだろうけど、ターミナルで文字化けるとちょっと悲惨。下記のサイトが参考になった。
OSの文字コードとlogの文字コードが異なり、tailなどで文字化ける場合の対処 - 雑想空間
nkf っていうやつがあるといいっぽい。Gmail とかをデバッガで開くと、trace とかしてないけど勝手に出力されちゃう系のログが出力されるので、それが直るか確認してみる。いつもはこんな感じでログを見る。

$tail -f ~/Library/Preferences/Macromedia/Flash\ Player/Logs/flashlog.txt
?x?? : easeOutCirc ?͊֐??ł͂???܂???
?x?? : easeOutCirc ?͊֐??ł͂???܂???
?x?? : easeOutCirc ?͊֐??ł͂???܂???
?x?? : easeOutCirc ?͊֐??ł͂???܂???
?x?? : easeOutCirc ?͊֐??ł͂???܂???
?x?? : easeOutCirc ?͊֐??ł͂???܂???
?x?? : easeOutCirc ?͊֐??ł͂???܂???
?x?? : easeOutCirc ?͊֐??ł͂???܂???
?x?? : easeOutCirc ?͊֐??ł͂???܂???
?x?? : ?x?????? 100 ?ɒB???܂???

文字化けしちゃってます。 nkf をインストールしてみる

$sudo port install nkf

これで確認

$tail -f ~/Library/Preferences/Macromedia/Flash\ Player/Logs/flashlog.txt | nkf -u -w
警告 : easeOutCirc は関数ではありません
警告 : easeOutCirc は関数ではありません
警告 : easeOutCirc は関数ではありません
警告 : easeOutCirc は関数ではありません
警告 : easeOutCirc は関数ではありません
警告 : easeOutCirc は関数ではありません
警告 : easeOutCirc は関数ではありません
警告 : easeOutCirc は関数ではありません
警告 : easeOutCirc は関数ではありません
警告 : 警告制限 100 に達しました

おぉ、ちゃんと文字化けが解消されましたね。これだけだとちょっとコマンドうつのめんどくさいので、スクリプト書いてみる。

$cd /usr/bin
$sudo vi flashlog

中身はこんな感じ。さっきのコマンドを書いただけ。

#!/bin/bash
tail -f ~/Library/Preferences/Macromedia/Flash\ Player/Logs/flashlog.txt | nkf -u -w

権限がないので、実行できるように変更しておく。

$chmod 755 flashlog

これで、"flashlog" ってタイプするだけで trace が tail できるようになる。超便利。