SCPTとapplescriptのエンコーディングについて
英語圏の方にはほとんど関係ない話ですが、
日本語環境だけは少し厄介な挙動があります。
そのため私は
作成や初期の動作確認は SCPT
実行用や完成品として保存する場合は
UTF8のテキスト形式のapplescript
という形で保存するようにしています。
なぜそうしているのか?
その理由をメモとして書いておきます。
まず
私は、Script Editor.appで編集しています。
また、これは私固有の問題?ですが
テキスト形式のapplescriptをターミナルで実行する事が多いのです。
これが前提条件?になるので、ちょと特殊な使い方なのは、自覚があります。
Script Editorでの書き出し
Script Editor.app で
コメントなどに ASCII以外の文字を含むSCPTファイルを
テキスト形式のapplescriptに書き出すと、多くの言語では次のようになります。
Script Editorは拡張属性 com.apple.TextEncoding に
utf-16;256を付与して、UTF-16 で保存します。
一方 Script Debugger はこの値を破棄し、
UTF8へ変換して UTF8で保存します。
ターミナルから実行することが多い私にとっては、
この挙動はむしろ好都合です。
(シバン付きのテキスト形式applescriptの場合UTF16保存されるとエラーになります。)
しかし日本語だけ事情が違う
日本語を含むSCPTの場合だけ、挙動が変わります。
(他の言語でも起こる可能性はありますが、少なくとも日本語では確認しています)
SCPTをテキストapplescriptに書き出したとき、
絵文字など x-mac-japaneseに含まれない文字が含まれている場合(例:絵文字等)は
他の言語と同じように
com.apple.TextEncoding = utf-16;256になります。
しかし
スクリプトに使われている文字が
すべてx-mac-japanese内だけの場合
com.apple.TextEncoding = x-mac-japanese;1が付与されて保存されます。
これは日本固有の、
SJISに近いmacOS固有のレガシーエンコーディングです。
Script Debuggerとの相性問題
Script Debugger は
com.apple.TextEncodingの内容を破棄します。参照もしません。
(参照しているのかも?しれませんが、誤判定しているので意味ない)
この x-mac-japanese を MacRomanとして判定して開くため、
(テキストを開く時にエンコードを選ぶオプションがない)
ASCII部分は読める
日本語は完全に文字化け
という状態になります。
そのため
Script Editorで編集・作成している場合、
テキスト形式にするとScript Debuggerがとても厄介な存在になります。
うっかり、上書き保存すると
ファイルを開いた時点でも文字化けしているので
バージョンを戻す事も出来ないので本当にやっかいです
テキストエディタの場合
以下のようなテキストエディタは
BBEdit
CotEditor
Jedit(開発終了)
com.apple.TextEncoding の値を参照して
エンコーディングを判定してファイルを開きます。
保存時にも
適切な com.apple.TextEncoding を付与して保存するため、
テキストapplescriptを正規表現などで編集する場合は
安全で便利な選択肢になります。
Visual Studio Codeの挙動
Visual Studio Codeは
com.apple.TextEncoding 属性自体を無視し、
独自の解釈でファイルのエンコーディングを推測して開きます。
そのため
x-mac-japanese を
SJISとして解釈することが多いです。
さらに問題なのは、
Visual Studio Codeで UTF8に変換して保存した場合でも
com.apple.TextEncoding 属性を変更も破棄しないことです。
つまり
com.apple.TextEncoding = x-mac-japanese;1
内容 = UTF8
または
com.apple.TextEncoding = utf-16;256
内容 = UTF8という 矛盾したファイルが出来上がります。
この状態のファイルを
Script Editor
BBEdit
など 拡張属性を参照して開くアプリケーションで開くと、
SJISとして解釈され、UTF8が文字化けした状態で開かれてしまいます。
結果として
何が起きているのか分からないほど文字バケした状態になります。
私のAppleScript作成のファイル運用方法
そのため私は次の手順で作業しています。
作り始めから初期の動作確認までは SCPT
スクリプトが出来上がり、動作テストも終わって
概ね完成した段階でUTF8のテキスト形式のapplescriptとして保存
実行権限を付与
ターミナルから実行
この方法だと
エンコーディングの問題に悩まされることがほぼありません。
また
テキスト形式のapplescriptでも保存しておくことで
Spotlight検索結果に出てくれるのも、とても助かっています。


