文字列のバイト数を得る

文字列のキャラクターとバイト数の違い

 文字数を数えるのと、バイト数を数えるのでは、意味が違います。
 なぜなら、MacOSで使われているSIFT-JISでは、1バイトの文字と2バイトの文字が混在しているからです。
 ユニコードならば、全ての文字は2バイトになるのですが、AppleScriptではプログラムはまだまた、ユニコードの扱いが不自由なので、この問題は文字列の操作をする時に常に付きまといます。
 標準状態で用意されていてバイトを扱えるものは、クリップボードとファイル、それから通信関連の命令ですから、とりあえずはそれらを利用することになります。
 このうち通信関連の命令で文字列のバイト数を得る方法はちょっと思い付かなかったので、割愛します。

クリップボードを使う

 まずは、クリップボードを使ってバイト数を求める方法を紹介します。
 set the clipboard to命令でクリップボードにバイト数を求める文字列をコピーし、clipboard info命令で、バイト数を得ます。

getBytesOf("この文字列は何バイト?")

on getBytesOf(theString)
	set the clipboard to theString
	item 2 of item 1 of (clipboard info)
end getBytesOf

 ここで、注意するのは、clipboard infoで返される値は、クリップボードにあるデータが複数である場合に対応して、複数のリストになると言うことです。
 この場合は文字列だけですが、{{string, 21}}のように二重のリストとなるので、先ほどのスクリプトのように「item 2 of item 1 of (clipboard info)」というように、指定する必要があります。

一度出力する

 ファイルはバイト単位で扱われ、かなり柔軟な指定も可能になっています。
 さらに良いことには、大きなサイズのデータを使ってもメモリ不足などによるエラーがおきません。
 問題は、ファイル操作は開いたり閉じたりの管理が面倒だということと、ファイル操作であるが故に、メモリ上だけの操作で無いので、どうしても遅くなってしまうと言うこと、適当なファイルを用意する必要があること等、あまり気軽なものでもありません。
 ファイル操作は、スクリプトで処理したい仕事の中でも多くを占めるものですから、あまり敬遠するのも考えものですし、なにしろパワフルです。
 とりあえず、アプレットならば自分自身をテンポラリ(一時使用)ファイルとして使うのが、別ファイルを用意する必要が無いので便利でしょう。

set theString to text returned of (display dialog "バイト数を調べる文字を入力して下さい" default answer "")

display dialog (theString & return & "は、" & getBytesOf(theString) & "バイトです")

on getBytesOf(theString)
	set myPath to (path to current application)
	try
		set fPointer to open for access myPath with write permission
		set eof of fPointer to 0
		write theString to fPointer
		set byteNum to (get eof fPointer)
	on error
	end try
	close access myPath
	return byteNum
end getBytesOf

 頻繁にファイルにアクセスすることになるので、あまり細かい処理では実用的ではありませんが、他の処理ではどうしようもない場合は、ファイルを利用することが「最後の砦」となる場合は多いので、ファイル操作に慣れておくのは良いことです。

外部に依頼する

 この問題は、OSAXやアプリケーションを利用すると簡単に解決できます。
 Tanaka's osaxのMT Byte Lengthを使えば一撃です。
 多くの日本産テキストエディタでもbyteオブジェクトを使えます。


2000-05-25