20260312

[AppleScript]テキスト形式のapplescriptファイルの面倒な文字コード問題(com.apple.TextEncoding)


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作成のファイル運用方法

そのため私は次の手順で作業しています。

  1. 作り始めから初期の動作確認までは SCPT

  2. スクリプトが出来上がり、動作テストも終わって
    概ね完成した段階で

  3. UTF8のテキスト形式のapplescriptとして保存

  4. 実行権限を付与

  5. ターミナルから実行

この方法だと
エンコーディングの問題に悩まされることがほぼありません。

また
テキスト形式のapplescriptでも保存しておくことで
Spotlight検索結果に出てくれるのも、とても助かっています。