#module
#deffunc zenkanainit
// 全角カナ位置を半角カナの順番で定義する
dim kpos, 58
kpos.0 = 146, 64, 66, 68, 70 // ヲ ァ ィ ゥ ェ
kpos.5 = 72, 131, 133, 135, 98 // ォ ャ ュ ョ ッ
kpos.10 = 0, 65, 67, 69, 71 // ー ア イ ウ エ
kpos.15 = 73, 74, 76, 78, 80 // オ カ キ ク ケ
kpos.20 = 82, 84, 86, 88, 90 // コ サ シ ス セ
kpos.25 = 92, 94, 96, 99, 101 // ソ タ チ ツ テ
kpos.30 = 103, 105, 106, 107, 108 // ト ナ ニ ヌ ネ
kpos.35 = 109, 110, 113, 116, 119 // ノ ハ ヒ フ ヘ
kpos.40 = 122, 125, 126, 128, 129 // ホ マ ミ ム メ
kpos.45 = 130, 132, 134, 136, 137 // モ ヤ ユ ヨ ラ
kpos.50 = 138, 139, 140, 141, 143 // リ ル レ ロ ワ
kpos.55 = 147, 1, 2 // ン ゛ ゜
return
#deffunc zenkana val
mref string, 24
mref rstr, 65
p = 0
repeat
wpeek chk string, cnt
// 終了
if chk = 0 : p = cnt : break
// 全角の場合
if (chk & $FF > 128) & (chk & $FF < 160) | (chk & $FF) > 223 {
wpoke rstr, p, chk
p += 2
continue cnt + 2
}
// 半角カナの場合
if (chk & $FF >= 166) & (chk & $FF <= 223) {
// 「゛」「゜」
if(chk & $FF) >= 222 {
p--
tmp = (chk & $FF) - 166
peek tmp.1, rstr, p
poke rstr, p, kpos.tmp + tmp.1
} else {
// 「ヴ」
if chk = 57011 {
wpoke rstr, p, 38019
p += 2
continue cnt + 2
}
// 「ー」
if (chk & $FF) = 176 {
wpoke rstr, p, 23425
// その他のカナ
} else {
tmp = (chk & $FF) - 166
wpoke rstr, p, kpos.tmp << 8 + 131
}
p++
}
// その他
} else {
poke rstr, p, chk & $FF
}
p++
loop
poke rstr, p // EOF
return
#global
sdim data, 128
data = "12345あガさダナパマヤらゎワゐヲゑンヴヵヶーーAbCdEfG"
font "MS 明朝", 16
mes "元の文字列 " + data
zenkanainit // 初めに一度だけ実行する(全角カナを定義する)
zenkana data // 全角カナに変換する
mes "全角カナ変換 " + refstr // 変換結果を表示する
data = "ィギシチニピイ"
mes "元の文字列 " + data
zenkana data // 全角カナに変換する(zenkanainitは実行不要)
mes "全角カナ変換 " + refstr // 変換結果を表示する
stop
|