TACKは文字列を扱うモジュールで2byte文字にも対応したくなることが
よくあるのですが
それなら文字列に2byte情報を混ぜればええやん!と気付いて
そんなモジュールを作成しました
2byte情報を配列に書き込むモジュール
FILE名:FILE_mix_str.hsp
TESTコード
よくあるのですが
それなら文字列に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 |