2008/12/20

LANG of scpt

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 件のコメント: