Mac OS X上のAppleScriptで、ファイル名やフォルダ名をFinderから取得して処理する場合、Finder側が文字+濁点で分割エンコードしたUnicode textを返してくる。
AppleScript側でUnicode textを扱う場合に、文字は濁点/半濁点を含むかたちでエンコードされているので、たいへん具合いのよろしくない事態に陥る。
これをnormalizeするために、
set aPath to aPath as string
set aPath to aPath as unicode text
と、Finderからファイル名などを取得したら決め打ちで無駄なcast処理を行うのが「お約束」である。まあこれで、文字列比較や文字ごとの処理などほとんど場合に対処できた。
ところが、指定フォルダ内のファイルで、ファイル名に指定文字列を含むものを取得したい場合、普通に何も疑問を持たずに、
tell application "Finder"
set resList to every file of tFol whose name contains "page"
end tell
などと書くことになるだろう。ANKの範囲ならこれで問題ない。だが、日本語で、
tell application "Finder"
set resList to every file of tFol whose name contains "ページ"
end tell
などと指定すると……実に1件もヒットしなかったりする。厳密にいえば、このコードは多分動く。パラメータをプログラムリスト中でダイレクトに定数として与えているからだ。
だがもしも、これ(filterString)を別途ファイル名から取得したような場合には完全にアウトである。
tell application "Finder"
set resList to every file of tFol whose name contains filterString
end tell
結果は何もヒットしない。これでハマりまくった。
同僚に相談してみたところ、指定フォルダ内のファイルのファイル名を一気に取得して……取得したファイル名をループで回しつつnormalizeし、そののちに個別に文字列比較を行うべし、ということになった。
確かに、これだとうまく動く。
ただ、本来であれば3行ぐらいで済む処理が10行以上の(余計な&追加の)記述を必要とするわけで、かったるいことにはかわりない。自作のコンテクストメニューアシスタントを用いて、コンテクストメニューから一発入力できるようにしておくのみである。