2011年01月25日

ocraでrubyに引数渡して実行

rubyスクリプトを簡単にWindowsのExeファイルに変換できるocraですが、実行時にどうしてもrubyに「-E utf-8」引数を渡して実行させたくて、どうにかならないかと調べてみました。

で、ソースを覗いたところ以下のような改変で可能な事がわかったので忘備録として載せておきます。

ocraの本体のrubyスクリプト(RubyInstaller for Windowsの1.92を標準インストールで利用して、「gem install ocra」していた場合はC:\ruby192\lib\ruby\gems\1.9.1\gems\ocra-1.2.0\bin\ocra)を開いて、484行目の

"#{rubyexe} \"\xff\\" + Ocra.dospath(target_script) + "\"#{extra_arg}")
の行を
"#{rubyexe} -E utf-8 \"\xff\\" + Ocra.dospath(target_script) + "\"#{extra_arg}")
のように書き換えれば作成されるExeファイルでもrubyの引数付きで実行出来るようです。

ちなみに、何でこんな変なことをしたかというと、日本語版Windows上で中国語ファイル名などを含んだディレクトリのファイルリストを取得したかったからです。

Windows上でのRubyでは、ファイルシステムの文字コードはシステムに強く依存するようで、日本語環境ではShift_JISでしかファイル名リストを取得出来ません。

しかし、NTFSやExplorerはUnicodeでファイルを扱っているため中国語ファイル名などは普通に存在しており実態と乖離が発生しています。

で、なんとかしようと色々試してみたところ1.9系のRubyにて「-Ku」や「-E utf-8」引数を付けた場合のみ「Dir.glob」の結果がUTF-8で戻ってきました。

本来ならば、1.9系での文字コードの指定はmagic commentや、最低でもshebangで指定すべきなのですが、下記のような全部入り指定でもDir.globの結果が変わらなかったため、上記のような書き換えをすることになりました。

1
2
3
4
#!ruby.exe -E utf-8
# -*- coding: UTF-8 -*- 
Encoding.default_external = 'utf-8'
Encoding.default_internal = 'utf-8'
で、うまく行ったかというと結局ダメ。

目的の中国語ファイル名は取れるようになったのですが、他に取れないファイルが多数発生してしまい、また、「Dir.glob("#{path}/**/*")」という指定ではドット(.)で始まるファイルやフォルダを元々取りこぼす事に気がついたので、仕様を満たせずRubyの利用は断念することとなりました。 (時間もなかったので結局ファイル名側を変更してお茶を濁した)

自分の使い方が悪いのかも知れませんが、このへんってどうにかならない物なのですかね?

Posted by Takuchan at 2011年01月25日 00:30 | トラックバック(0)