#module
#deffunc hankanainit
// カタカナと同じ順序で半角カナを定義する
sdim kana, 3, 87
kana.0 = "ァ" , "ア" , "ィ" , "イ" , "ゥ"
kana.5 = "ウ" , "ェ" , "エ" , "ォ" , "オ"
kana.10 = "カ" , "ガ", "キ" , "ギ", "ク"
kana.15 = "グ", "ケ" , "ゲ", "コ" , "ゴ"
kana.20 = "サ" , "ザ", "シ" , "ジ", "ス"
kana.25 = "ズ", "セ" , "ゼ", "ソ" , "ゾ"
kana.30 = "タ" , "ダ", "チ" , "ヂ", "ッ"
kana.35 = "ツ" , "ヅ", "テ" , "デ", "ト"
kana.40 = "ド", "ナ" , "ニ" , "ヌ" , "ネ"
kana.45 = "ノ" , "ハ" , "バ", "パ", "ヒ"
kana.50 = "ビ", "ピ", "フ" , "ブ", "プ"
kana.55 = "ヘ" , "ベ", "ペ", "ホ" , "ボ"
kana.60 = "ポ", "マ" , "ミ" , " " , "ム"
kana.65 = "メ" , "モ" , "ャ" , "ヤ" , "ュ"
kana.70 = "ユ" , "ョ" , "ヨ" , "ラ" , "リ"
kana.75 = "ル" , "レ" , "ロ" , "ワ" , "ワ"
kana.80 = "イ" , "エ" , "ヲ" , "ン" , "ヴ"
kana.85 = "カ" , "ケ"
return
#deffunc hankana val
mref string, 24
mref rstr, 65
p = 0
repeat
wpeek chk, string, cnt
// 終了
if chk = 0 : break
// 全角の場合
if (chk & $FF > 128) & (chk & $FF < 160) | (chk & $FF > 223) {
// 全角カナの場合
if (chk & $FF = 131) & (chk >> 8 >= 64) & (chk >> 8 <= 150) {
// 半角カナ取り出し
chk = (chk >> 8) - 64
wpeek chk, kana.chk
// 濁音・半濁音となる場合は2バイト分書き込む
if chk >> 8 = '゙' | (chk >> 8 = '゚') {
wpoke rstr, p, chk
} else {
poke rstr, p, chk & $FF
p-- // 1バイトのための調整分
}
// それ以外
} else {
// 長音「ー」
if chk = 23425 {
poke rstr, p, 'ー'
p-- // 1バイトのための調整分
} else {
wpoke rstr, p, chk
}
}
p += 2
continue cnt + 2
}
// 半角の場合
poke rstr, p, chk & $FF
p++
loop
poke rstr, p // EOF
return
#global
sdim data, 128
data = "12345あガさダナパマヤらゎワゐヲゑンヴヵヶーーAbCdEfG"
font "MS 明朝", 16
mes "元の文字列 " + data
hankanainit // 初めに一度だけ実行する(半角カナを定義する)
hankana data // 半角カナに変換する
mes "半角カナ変換 " + refstr // 変換結果を表示する
data = "イギシヂニピミヰ"
mes "元の文字列 " + data
hankana data // 半角カナに変換する(hankanainitは実行不要)
mes "半角カナ変換 " + refstr // 変換結果を表示する
stop
|