〜 テキスト 〜
変数内のテキスト文字数を取得

Windows版のHSP標準文字コードはシフトJISですので、使用文字により半角全角が混合してしまいます。
HSPに標準の文字列操作命令が幾つも用意されていますが、
パラメータに指定する文字位置・文字数はいずれもバイト単位であり、利用者に入力してもらったテキスト、
またはファイルから読み込んだテキストの一部を操作する時は、判別する必要があります。
シフトJISにおいて、半角文字は1バイト、全角文字は2バイトとなっており、
HSP2の入力ボックス(input命令など)は、指定バイト数分しか入力することが出来ませんが、
HSP3ではOSにより、指定した値がバイト数と文字数の場合とに分かれているので注意が必要です。
今回のTipsは、例えばそのようなOSによる違いをなくす為に使うと有効でしょう。
HSP3からは、標準でUnicodeとの相互変換を行う命令が用意されてますので、
全てを2バイト化することでも、文字数を得ることが出来ます(バイト数÷2=文字数)。
	

wordchk 対象変数, 位置
対象変数判別したい文字列の入った変数を指定する。
statに-1(範囲外)、0(半角)、1(全角)のいずれかがセットされる。
位置指定変数の位置をバイト単位で指定する。

strnum 受取先変数, 対象変数
受取先変数文字数を読み出す先の変数名を指定する。
内部でwordchk命令を使用しているため、strnum命令の前にwordchk命令を定義すること!
対象変数文字数を調べたい文字列型の変数を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#module
#deffunc wordchk val, int
	mref txt, 24 : mref ichi, 1
	mref stt, 64
	peek chk, txt, ichi
	if chk = 0 : stt = -1 : return						// 範囲外
	if (chk > 128 & (chk < 160)) | (chk > 223) : stt = 1 : else : stt = 0	// 1byte=0 2byte=1
	return

#deffunc strnum val, val
	mref num, 16 : mref txt, 25
	num = 0
	repeat
		wordchk txt, cnt
		if stat = -1 : break						// 範囲外
		num++
		if stat = 1 : continue cnt + 2					// 2byteなら2byte進める
	loop
	return
#global

	string = "abあcdeいfうghえijおklmかnopきqくrsけtuvこwxyz"
	strnum mojisuu, string
	mes "「" + string + "」には\n" + mojisuu + "文字あります。"
	stop

結果 = wordchk(対象変数, 位置)
結果-1(範囲外)、0(半角)、1(全角)のいずれかがセットされる。
対象変数判別したい文字列の入った変数を指定する。
位置指定変数の位置をバイト単位で指定する。

結果 = strnum(対象変数)
結果指定された文字列または、文字列型変数が持っている文字数を返す。
内部でwordchk命令を使用しているため、strnum命令の前にwordchk命令を定義すること!
対象変数文字数を調べたい文字列型変数を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#module
#defcfunc wordchk str txt, int ichi
	s = txt
	if ichi < 0 : return -1							// 範囲外
	chk = peek(s, ichi)
	if (chk > 128 & chk < 160) | chk > 223 : return 1			// 2byte=1
	if chk = 0 : return -1 : else : return 0				// 1byte=0 範囲外=-1

#defcfunc strnum var txt, local num
	repeat
		if wordchk(txt, cnt) = -1 : break				// 範囲外
		num++
		if stat = 1 : continue cnt + 2
	loop
	return num
#global

	string = "abあcdeいfうghえijおklmかnopきqくrsけtuvこwxyz"
	mes string + " には " + strnum(string) + "文字あります。"