日本語ファイル名を無理矢理使う

開発してる人は多分知ってると思うけど、Konfabulatorでは日本語ファイル名が鬼門だ。*1
だから使わない、というのが正解なんだけど、そうはイカの足、iTuneで邦楽の楽曲フォルダ/ファイル名は日本語にされてしまう。
多分、それに関連するんだろうけど、本家Forumでこんな質問が上がってたので、ちょっとやり方を考えてみよう。



答えその1. UTF8でkonファイルを書いちゃう。
mi(何でもいいから、文字コードをいろいろ選べるテキストエディタ)を使って、Desktopフォルダに「ほげ.txt」という名前のShift-JISで適当に中身を書いたテキストファイルを作り、下のコードを適当なkonファイル(例えばhoge.kon)に書く。

<action trigger="onLoad">
var filename = "ほげ";
print("filename:"+filename+".txt");
var result = runCommand('cat ~/Desktop/'+filename+'.txt');
print(result);
</action>
そしたらhoge.konをまずShift-JISで保存して実行してみよう。するとfilenameは正常に表示されるが、catの方ではファイル名がないと言われるはずだ。
次にhoge.konをUTF8で保存して実行してみよう。するとfilenameは化けるけどcatの中身は正常に表示されるのがわかるだろう。
この方法の長所はとにかく判りやすくて簡単なこと。欠点はkonファイルに直接書いてる日本語(上の「ほげ」)を表示させるとすべて化けてしまうこと。日本語を表示させる必要性が少ないのであれば、必要な日本語だけすべてShift-JISで別ファイルにしちゃってcatで表示させるなんてことも一応可能。また別の欠点として、ファイルを指定するだけならば可能だけどファイル名を表示させたい場合などには使えない。



答えその2.jcode.pm+Perlで解決する
上のhoge.konを下のように書き換えてShift-JISで保存する。
<action trigger="onLoad">
var filename = "ほげ";
print("filename:"+filename+".txt");
var result = runCommand('cat ~/Desktop/'+filename+'.txt');
print(result);
var result = runCommand('perl hoge.pl "cat ~/Desktop/" "'+filename+'" ".txt"');
print(result);
</action>
そして下のコードをhoge.plという名前にしてhoge.konと同じフォルダに入れる。
#!usr/bin/perl
use Jcode;
$filename_utf8 = Jcode->new($ARGV[1],sjis)->utf8;
$result=`$ARGV[0]$filename_utf8$ARGV[2]`;
$result= Jcode->new($result)->sjis;
print "$result\n";
それから同じフォルダにjcode.pm(とjcodeフォルダ)を入れる。
要するに日本語ファイル名をjcodeでsjisからUTF8に変換してperlからシェルで実行するってこと。jcodeの代わりに、pantherならEncode module使ってもいいし、自分のマシン限定ならnkfでもいいだろうけど。
hoge.plの2番目の$result=はこの例だと不要なんだけど、一応返り値がutf-8の場合に備えてつけてる。この方法だと上ではできないことも一応は可能になる。ただ上のコードではescapeとかをかなり手抜きしてるんで、ファイル名によっては表示できないかも。



さらに応用
上の方法で日本語名のファイルの扱いが可能になっても、たとえば日本語名の画像ファイルをimage.srcに指定することはできない。ファイル自体の扱いはうまくいってるんだけど、それを「.png」などのファイルとしてKonfabulatorが認識してくれないためにエラーが出る。そこでちょっと汚いやり方だけど
runCommand("cp 'Resources /ほげ.png' 'Resources/hoge.png'");
dummyImage.src="Resources/hoge.png";
(utf8でkonを書く場合のコード)
などとしてダミーの画像ファイルにコピーしてやる必要がある

*1:なんでかと言うと、Konfabulatorで日本語を正しく表示させるためには文字コードがshift-jis(MacRoman)でないといけない。一方、MacOSXではファイル名がUTF-8になっている。だから変換かまさない限り正しく読めないのだ。