〜 テキスト 〜
全角カナを半角カナに変換

英数字同様、かなもある一定の規則に従ってアスキーコードが割り振られています。
全角かなは2バイト文字で、1バイト目は131固定、2バイト目が64から1ずつ増加し、
半角カナはコードの166から順に1ずつ増えていきます。
コード0123456789
 6X
 7X
 8X
 9X
10X
11X
12X
13X
14X
15X
コード0123456789
16X
17X
18X
19X
20X
21X
22X
半角カナの表は、文字化けを防ぐために全角で載せていますが、半角カナの並びと考えてください。 下記のスクリプトの半角カナを定義している箇所はそのまま半角で表示しているので、 作者の環境(IE)は問題ないものの、正常に表示されない環境も存在かもしれませんが了承願います。 上記の表を見ていただいたらわかる通り、「ヲ」の配置が全く違いますし、 濁点・半濁点だけ別に1バイトとなっており、「ヮ」「ヰ」「ヱ」「ヵ 」「ヶ」等も存在しません。 どちらも同じカタカナと言えど、全角と半角とで規則性が薄いということで、変換テーブルを用いてみました。 尚、一般的に使われる長音「ー」は全角カナのコード領域にはありませんでしたので、 長音の場合は、半角長音に置き換えるロジックを直接組み込んで対応しました。 コチラで紹介しているWinAPIの利用でも、全角カナを半角カナに変換できますが、 半角にする際、カナ以外の全角英数も半角英数に変換してしまいます。 英数の半角全角はそのままで置いておきたいという場合は、下記を参考に自分で実装してしまいましょう。

hankanainit
[パラメータなし]初期化するだけのため、パラメータは必要ない。

hankana 対象変数
対象変数半角カナへの変換対象変数を指定する。
尚、変換結果はシステム変数refstrに代入する為、4096バイトに収まる文字列にすること。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#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

hankanainit
[パラメータなし]初期化するだけのため、パラメータは必要ない。

結果 = hankana(対象変数)
結果変換した半角カナを含む文字列の受取先を指定する。
対象変数半角カナへの変換対象変数を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#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

#defcfunc hankana var string, local rstr, local chk, local p
	sdim rstr, strlen(string) + 1
	repeat
		chk = wpeek(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
			  chk = wpeek(kana.chk)
			  // 濁音・半濁音となる場合は2バイト分書き込む
			  if (chk >> 8) = 222 | (chk >> 8) = 223 {
			    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
	return rstr
#global

	sdim data, 128
	data = "12345あガさダナパマヤらゎワゐヲゑンヴヵヶーーAbCdEfG"
	font "MS 明朝", 16
	mes "元の文字列  " + data
	hankanainit                             // 初めに一度だけ実行する(半角カナを定義する)
	mes "半角カナ変換 " + hankana(data) // 半角カナに変換する
	data = "イギシヂニピミヰ"
	mes "元の文字列  " + data
	mes "半角カナ変換 " + hankana(data) // 半角カナに変換する(hankanainitは実行不要)