shoes2 を
http://shoooes.net/tutorial
ダウンロードしてとりあえずオセロなど動かしていたら思い出したこと。
astest.rb
#!/pathto/ruby191/bin/ruby
# -*- coding: utf-8 -*-
begin
e = Encoding.default_external.name
abort "Lang Error #{e}\n" unless e == "UTF-8"
rescue
abort "ruby version Error\n"
end
print e
これを、ruby 1.9.1 (2008-10-28 revision 19983) [i386-darwin9.5.0] で実行すると
UTF-8
が返ってくる。この astest.rb に実行権限を与えてやり AppleScript から実行できるようにしておく。
今度は AppleScript から astest.rb を実行するためのスクリプト(myscpt.scpt)をつくり astest.rb と同じ階層に保存。
myscpt.scpt
# AppleScript's version "2.0.1". OS X 10.5.6
# dir_base =>いまいる(このファイルの保存場所)ディレクトリの親ディレクトリ
tell application "Finder"
set dir_base to POSIX path of (folder of (folder of (path to me) as alias) as alias)
end tell
# dir_bin =>親ディレクトリ内 bin ディレクトリ
set dir_bin to dir_base & "bin/"
# コマンドテキスト生成
set comstr to "cd " & dir_bin & "; ./astest.rb"
# 発行
set res to do shell script comstr
これを実行するとなぜかエラーになる
AppleScript エラー
Lang Error US-ASCII
改めてターミナルで自分の今の環境変数を確認してみたけれど US-ASCII ではない。
% env |grep LANG
LANG=ja_JP.UTF-8
回避策はあるのだろうか?と考えた末...
# コマンドテキスト生成
#set comstr to "cd " & dir_bin & "; ./astest.rb"
set comstr to "export LANG='ja_JP.UTF-8';cd " & dir_bin & "; ./astest.rb"
結果
"UTF-8"
do shell script 中でLANG を設定してやればいいようだ。こんなことができるなんて初めて知った。
set comstr to "ENV"
set res to do shell script comstr
で、AppleScriptの環境変数をみることができた。どうやらここではまっていたようだ。。。
+++ memo +++
教訓:AppleScript が使う環境変数と自分の環境変数は異なる # OS X 10.5.6
ruby 1.9.x のものを AppleScript から実行してエラーが発生する時は encoding の問題かもしれないので注意が必要。と。
+++ 追記 +++
2009-01-27.
http://developer.apple.com/jp/technotes/tn2002/tn2065.html
http://developer.apple.com/qa/qa2001/qa1067.html
これらを読んでわかったこと. ENV LANG は
tell Application "Finder" ...
tell me ...
からは取得できない。
tell application "Finder"
set lang to do shell script "ENV"
end tell
lang
これらが返す値に HOME, PATH, USER... などは含まれているものの肝心の LANG は含まれていない。
tell application "Terminal"
set lang to do shell script "ENV"
end tell
には LANG は含まれている。
というこことから export しないで LANG 取得するにはこれが最短かなあ。
tell application "Terminal" to set lang to do shell script "ENV|grep LANG"
=>
"LANG=ja_JP.UTF-8"
でも、Terminal 起動させちゃうのはちょっと...
ちなみに
http://macscripter.net/viewtopic.php?id=24805
を読んで試したら
set SystemLanguage to do shell script "defaults read .GlobalPreferences AppleLanguages | tr -d [:space:] | cut -c2-3"
=>
"ja"
だけだった。
+++ さらに追記 +++
2009-01-29.
プログラミング Ruby
P41 を読んで
エンコーディング名を指定して ruby 1.9.1 を起動する方法がわかった
% cat as-test.rb
#!/path/to/ruby191/bin/ruby1.9 -E utf-8
# coding: utf-8
begin
str = ARGV[0]
if str
puts str_e = str.encoding.name
puts str_v = str.valid_encoding?
end
e = Encoding.default_external.name
abort "Lang Error #{e}\n" unless e == "UTF-8"
rescue => err
abort "Error.#{err}.\n"
end
print "ExtEncoding:#{e}\n"
print __ENCODING__, "\n"
% ./as-test.rb aa
=>
UTF-8
true
ExtEncoding:UTF-8
UTF-8
AppleScript からの呼び出しテスト
as-test.scpt をデスクトップに保存ー実行。
# as-test.scpt
tell application "Finder"
display dialog "input" default answer "あいうえお"
set str to text returned of result as text
set path_file to POSIX path of (file "as-test.rb" of desktop as alias)
set a to do shell script "./" & path_file & " " & str
end tell
a
=>
"UTF-8
true
ExtEncoding:UTF-8
UTF-8"
+++ memo +++
AppleScript ダイアログで受け取る文字列のエンコーディングは Ruby を通じて UTF-8 になっているのが確認できた。それでも、受け取る側の Ruby File ではその文字列をなにか処理する時には本当にUTF-8 か?とか valid か?をみるようにしておいたほうがいいのかも。
OS X 10.5.6
AppleScript's version "2.0.1"
Finder's version "10.5.8"
--imported_from
http://www.midore.net/daybook/2008/12/1229704901.html
0 件のコメント:
コメントを投稿