理屈の上では、こんな感じ。
https://ja.wikipedia.org/wiki/UTF-8#%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88
参考文献は上の。ビットフィールドを意識して、ちゃんと考えれば理解できるが……(説明する気力はなかったりする)
#include "hsp3utf.as"
jsdata="\\u30DB\\u30C3\\u30C8\\u30B9\\u30FC\\u30D7"
current_pos=0
decode_pos=0
sdim decode,1024//容量は予め確保のこと。適切にね。
repeat
//とりあえず\uから始まる部分を探す。あくまで簡易的に。
next_pos=instr(jsdata,current_pos,"\\u")
if(next_pos<0):break
current_pos+=next_pos+2
hex=strmid(jsdata,current_pos,4)
dec=int("$"+hex)//int型に変換して、UTF-8化の処理に入る。
if(dec<128){
poke decode,decode_pos,dec
decode_pos++
}else:if(dec<1<<11){
poke decode,decode_pos,$c0|((dec>>6)&0x1f)
mes strf("%x",$c0|((dec>>6)&0x1f))
poke decode,decode_pos+1,$80|(dec&0x3f)
mes strf("%x",$80|(dec&0x3f))
decode_pos+=2
}else{
poke decode,decode_pos,$e0|((dec>>12)&0x0f)
mes strf("%x",$e0|((dec>>12)&0x0f))
poke decode,decode_pos+1,$80|((dec>>6)&0x3f)
mes strf("%x",$80|((dec>>6)&0x3f))
poke decode,decode_pos+2,$80|(dec&0x3f)
mes strf("%x",$80|(dec&0x3f))
decode_pos+=3
}
loop
mes decode
//実際にバイト列が一致しているか、見比べてみよう。
decode="ホットスープ"
pos 100,0
repeat strlen(decode)
mes strf("%x",peek(decode,cnt))
loop
mes decode