TACKは文字列を扱うモジュールで2byte文字にも対応したくなることが
よくあるのですが
それなら文字列に2byte情報を混ぜればええやん!と気付いて
そんなモジュールを作成しました

2byte情報を配列に書き込むモジュール
FILE_count_2byte.hspのありか

FILE名:FILE_mix_str.hsp
//	このスクリプトを実行するには
//	"FILE_count_2byte.hsp"が必要です
;	#include "FILE_count_2byte.hsp"

#module mix_str

#defcfunc mix_str_and_info_2byte_at_mix_str var p
//	文字列に2byte情報を混ぜて返す
//	p:混ぜる元の文字列
//	以下、2byte情報を混ぜた文字列を「mix_strの文字列」と呼ぶ
//	・混ぜ方
//	その文字が2byte文字ではないなら131と文字の値
//	その文字が2byte文字なら132と文字の値
//	を書き込む

//	2byte文字の情報を"1"や"a"にしなかったのは
//	2byte文字の2文字目が0の場合、そこで文字列が途切れてしまうため

//	例えば「1あ2」を渡すと
//	"131 49 132 130 132 160 131 50"に変換する
//	ちなみに「1あ2」の文字コードは
//	"49 130 160 50"である
l=strlen(p)
dim d,l

//  do_at_count_2byte array a_r,var s_p
//	文字列の要素が2byte文字だと配列のその位置に1を書き込みます
do_at_count_2byte d,p

sdim r,(l*2+1)
i=0:ii=0
while 1
//	pから1文字読む
c=peek(p,i)
if d.i==0{
//	その文字が2byte文字ではないので131と文字の値を書き込む
poke r,ii,131
poke r,(ii+1),c
}else{
if d.i==1{
//	その文字は2byte文字でなので132と文字の値を書き込む
poke r,ii,132
poke r,(ii+1),c
}
}
//	文字列の終端に達したので繰り返しを抜ける
if i>=(l-1){_break}
i++:ii+=2
wend
poke r,(l*2),0
return r

//	mix_strのindex番目の文字を返す
//	p:文字を得たいmix_strの文字列
//	index:文字を得たいmix_str内のindex
#defcfunc get_char_at_mix_str var p,int index
l=strlen(p)
if (index*2+1)>l{
logmes "get_char_at_mix_str内のerror"
logmes "indexの値が大きすぎます"
logmes "文字列の長さ:"+str(l)
logmes "index*2+1:"+str(index*2+1)
return -1
}
return peek(p,(index*2+1))

//	mix_strのindex番目の2byte情報を返す
//	p:2byte情報を得たいmix_strの文字列
//	index:2byte情報を得たいmix_str内のindex
#defcfunc get_2byte_info_at_mix_str var p,int index
l=strlen(p)
if (index*2+2)>l{
logmes "get_2byte_info_at_mix_str内のerror"
logmes "indexの値が大きすぎます"
logmes "文字列の長さ:"+str(l)
logmes "index*2+2:"+str(index*2+2)
return -1
}
r=peek(p,(index*2))
if r==131:return 0
if r==132:return 1
return -1

//	mix_strを逆変換する
//	p:逆変換するmix_strの文字列
#defcfunc back_at_mix_str var p
l=strlen(p)
sdim r,(l/2)
repeat (l/2)
c=peek(p,(cnt*2+1))
poke r,cnt,c
loop
return r

//	mix_strの変換前の文字列の長さを返す
//	p:長さを求めるmix_strの文字列
#defcfunc strlen_at_mix_str var p
return (strlen(p)/2)

//	mix_strを分割する
//	p1:分割するmix_strの文字列
//	p2:分割するindex(最初のindex)
//	p2の値が-1の時は右からp3文字、分割する
//	p3:分割する文字数
#defcfunc strmid_at_mix_str var p1,int p2,int p3
n=p3*2
if p2==-1{
return strmid(p1,-1,n)
}else{
m=p2*2
return strmid(p1,m,n)
}
return -1

//	mix_strをdumpする
//	p:dumpしたいmix_strの文字列
#deffunc dump_on_mix_str_and_info_2byte_at_mix_str var p
sdim t,16
repeat strlen(p)
s=peek(p,cnt)
poke t,0,s
logmes t+":"+str(s)
loop
return

#global

TESTコード
#include "FILE_count_2byte.hsp"
#include "FILE_mix_str.hsp"
//以下TESTコード
//012 3456789101112 13141516
s="abcあいうえお0123"
rr=mix_str_and_info_2byte_at_mix_str(s)
mes back_at_mix_str(rr)

mes strlen_at_mix_str(rr)
t=strmid_at_mix_str(rr,0,3)
mes back_at_mix_str(t)
t=strmid_at_mix_str(rr,3,10)
mes back_at_mix_str(t)
t=strmid_at_mix_str(rr,-1,4)
mes back_at_mix_str(t)

mes get_char_at_mix_str(rr,0)
mes get_char_at_mix_str(rr,3)
mes get_char_at_mix_str(rr,16)
mes get_char_at_mix_str(rr,17)

mes get_2byte_info_at_mix_str(rr,0)
mes get_2byte_info_at_mix_str(rr,3)
mes get_2byte_info_at_mix_str(rr,16)
mes get_2byte_info_at_mix_str(rr,17)

dump_on_mix_str_and_info_2byte_at_mix_str rr

ss="1あ2"
rrr=mix_str_and_info_2byte_at_mix_str(ss)
dump_on_mix_str_and_info_2byte_at_mix_str rrr