ここでは、ある文字が1バイト文字であるか2バイト文字であるかを判別したり、文字列のバイト長を調べたり、2バイト文字のASCII番号を取り出したりするためのTipsを述べます。
文字列のバイト数を求める
AppleScriptでは、文字列の長さを表す方法として「文字数」が使われます。しかし、文字には1バイト文字と2バイト文字があり、AppleScriptではこれらを区別する方法がありません。従ってそれを知りたいと思ったときは、自分でそれ専用のスクリプトを組む必要があります。
まず、ある文字が1バイト文字か2バイト文字か見分けるもっとも単純な方法を考えてみます。
一番確実なのは、バイト数の知りたい文字を新しいファイルに書き込み、そのファイルの大きさを知る方法です。これがバイト長を知るための基本的な考え方だと言っていいと思います。
ただ、この方法では「新しいファイルを作成する」という手間が必要になります。一度作ってしまえば何度でも使えるとはいえ、サブルーチンを使用するたびに保存ダイアログを使ってファイルを作成するのは面倒ですよね。だからといってスクリプトから自由に使えるファイルを常備しておくわけにもいかないし…
しかしよく考えると、スクリプトから常にアクセス可能なファイルが一つだけあります。それは「スクリプト自身のデータフォーク」です。アプレットもドロップレットも、自分自身のデータフォークはまったく使用しません。従って、スクリプトの中からそれ自身のデータフォークにアクセスすることに関しては、全く制約がないのです。
自分自身のファイルパスは、「path to me(これをパス名)」で得ることができるので、後は一般のファイルと同じように「open for access ... close access」で自由に書き込み、読み出しをすればいいだけです。以下に例を示します。
GetByte(GainText)とは
MyPathを(これをパス名)にする
MyPathを書き込み許可:真でアクセス開始する
MyEOFを(MyPathをeof取得)にする
GainTextをMyPathへMyEOFから書き込む
NewEOFを(MyPathをeof取得)にする
ByteNumをNewEOF−MyEOFにする
MyPathをMyEOFへeof設定
MyPathをアクセス終了する
ByteNumを返す
以上
on GetByte(GainText)
set MyPath to (path to me)
open for access MyPath with write permission
set MyEOF to (get eof MyPath)
write GainText to MyPath starting at MyEOF
set NewEOF to (get eof MyPath)
set ByteNum to NewEOF - MyEOF
set eof MyPath to MyEOF
close access MyPath
return ByteNum
end GetByte
ただ、ここで気を付けなければいけないのは、このルーチンを「スクリプト編集プログラム」から実行した場合、このアプリケーション自身に文字列を書き込んでしまうということです。「スクリプト編集プログラム」もアプレットなどと同じくデータフォークには何のデータも持っていませんが、アプリケーションの書き換えは著作権に抵触する恐れもありますし、何といってもスクリプトを実行中にエラーが生じた場合、この書き込みはそのまま残ってしまいます。従ってこのスクリプトは、アプレットやドロップレットなど独立したアプリケーションの中で利用するようにして下さい。
2バイト文字のASCII番号を調べる
ところで、AppleScriptには文字のASCII番号を調べるための命令があります。CharToNum(ASCII Number of)がそうですが、これは1バイト文字にしか対応していないため、2バイト文字を指定するとその1バイト目しか番号を返してくれません。例えば「あ」は「130:160」ですが、CharToNumでは「130」だけが返されます。
しかしこれも、「自分自身に書き込む」という考え方を応用すれば、簡単に調べることができます。やり方は単純で、文字列を自分自身に書き込んでから1バイトずつ文字を取り出して、そのASCII番号を調べればいいだけです。
GetASCIINumber(TextRes)とは
MyPathを(これをパス名)にする
MyPathを書き込み許可:真でアクセス開始する
MyPathを0へeof設定
TextResをMyPathへ1から書き込む
ByteNumを(MyPathをeof取得)にする
ResListを{}にする
iが1からByteNumまで
charを(MyPathをiからiまで読み出す)にする
AsciiNumを(charのcharToNum)にする
ResListをResList&AsciiNumにする
以上
MyPathを0へeof設定
MyPathをアクセス終了する
ResListを返す
以上
on GetASCIINumber(TextRes)
set MyPath to (path to me)
open for access MyPath with write permission
set eof MyPath to 0
write TextRes to MyPath starting at 1
set ByteNum to (get eof MyPath)
set ResList to {}
repeat with i from 1 to ByteNum
set char to (read MyPath from i to i)
set AsciiNum to (ASCII number of char)
set ResList to ResList & AsciiNum
end repeat
set eof MyPath to 0
close access MyPath
return ResList
end GetASCIINumber
尚、このルーチンを使用したアプレットを、参考のために挙げておきます。
GetASCIINumber.hqx
以上、文字のバイト数とASCII番号に関するTipsでした。