Mac OS X で人気のエディタ Jedit X 用の misima SOAP クライアントを書いている。Mac OS X では AppleScript でさまざまなアプリケーションを制御できる。強力。また AppleScript は XML-RPC や SOAP で Web サービスを利用する仕組みがビルトインされている。先進的。
とはいえ,AppleScript は英語のような文法構造を特色としており,Mac ファンに言わせれば解りやすいとのことであるが,私には中途半端なだけである。そもそもプログラミング言語は自然言語とは違う。予約語に類するものは英数字だけで記述するのが普通だと思われるのに,AppleScript では MacRoman (Latin-1 の Mac 方言) 8 ビット文字 (例えば "as «class utf8»" の "« »") で属性を記述するようなところもあり,信じられない書記仕様なのである。
さて,Mac ADC (Apple Developer Connection) サイトの技術文書などをたよりに,Jedit X から AppleScript call soap インタフェースを用いて,misima SOAP 接続を行うスクリプトを書いてみた。これは Jedit X で作成中の文書において,misima で旧字・旧仮名変換したいテキストを選択して実行すると,私のサイトのサーバの変換結果で選択テキストを置換する手続きである。行の折り返しを "¬" で示している。
property misimasoap : ¬ "http://yasuda.homeip.net/axis/services/misimaSoapConnector" --- Jedit X 選択文字列の取得。空なら終了。 tell application "Jedit X" tell front document copy selected text to tString end tell if (count characters of tString) = 0 then display dialog "文字列を選択してください。" buttons {"OK"} return end if end tell --- call misimaConv handler set the resultText to misimaConv("-kyitq -s c ", tString) --- 変換結果で選択テキストを置換 tell application "Jedit X" tell front document set selected text to resultText end tell end tell --- misimaConv SOAP misima 変換ハンドラ定義 on misimaConv(misimaParm, targetString) tell application misimasoap return call soap {method name:"misimaConvert", ¬ parameters:{Params1:misimaParm as string, ¬ Params2:targetString as Unicode text}} end tell end misimaConv
ところが,このコードを Jedit X の スクリプトウィンドウから登録して実行してみると,call soap のリターン文字列 (変換結果) の日本語が "<<Unknown Escape>>" になってしまい。期待した結果が得られない。サーバにはきちんとクエリが届いていて結果を返却していることが確認でき,SOAP 接続は問題なさそうである。TeX 変換指定でタイ語やロシア語,韓国語を送信してみると,変換結果が ASCII 文字だけからなるものはきちんと返されるので,送信文字がすでに異常になっているわけでもない。
soap リターン値の class を検査してみると "Unicode text" となるので問題ないはずである。Apple Event Manager の XML パーサがへぼいのか。ちなみに Unicode 漢字を selected text に貼付けると,JIS X 0208 にない文字が化ける。Microsoft Word,VBA Office Web Services Toolkit の場合は Unicode をしかるべく処理できたのにつけ,Mac AppleScript は文字コードについて Windows に遅れをとっている印象を受ける。これ,Apple のどこに言えばよいのだろうか。インターネットを検索しても,どうも私のような課題で悩んでいるひとはいないらしい。
call soap ではなく do shell script (AppleScript 外部シェル起動インタフェース) で,Mac OS X のローカルにインストールした misima をコールするときちんと変換結果が Jedit X に貼付く。call soap のリターンはきちんと UTF-8 を扱えないと言えそうである。よって,Jedit X 用の SOAP クライアントも do shell script で Java SOAP クライアントを呼び出して行うやり方としたほうがよさそうである。
(10.29 付記: 上記問題点は,サーバの返却値を Unicode 十六進数形式にすることによって,call soap を掻い潜り,Perl の print pack("U*", Unicode 十六進数形式); で通常の Unicode 文字列に復元することで解決した。こちらを参照)