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

英数字同様、かなもある一定の規則に従ってアスキーコードが割り振られています。
半角カナはコードの166から順に1ずつ増えていき、
全角カナの1バイト目は131固定、2バイト目が64から1ずつ増加します。
コード0123456789
 6X
 7X
 8X
 9X
10X
11X
12X
13X
14X
15X
コード0123456789
16X
17X
18X
19X
20X
21X
22X
右端のカタカナ表は、文字化けを防ぐために全角で載せていますが、半角カナの並びと考えてください。 上記の表を見ていただいたらわかる通り、「ヲ」や小文字の配置が全く違いますし、 濁点・半濁点だけ別に1バイトとなっており、「ヮ」「ヰ」「ヱ」「ヵ 」「ヶ」等も存在しません。 半角カナ側に存在しない文字は、全角カナに変換しても問題ないので無視できるレベルですが、 濁点・半濁点付きの文字は、2文字で1文字に置き換える作業が出てきますので、 変換テーブルを用いても簡単には変換できません。 ということで、サンプルでは変換テーブル+無理矢理に紐付けてみました…。 無理矢理と言うのは、濁点付きの場合、濁点なしのコード位置+1を、 半濁点の場合、半濁点なしのコード位置+2にある全角カナに置き換える作業を行っています。 つまり、全角の「ハ」に変換する場合は、コード110を使用し、「バ」は+1した111を、 「パ」は+2した112を使用する、といった少々強引なやり方で変換していますので、 もし、半角文字で「ヌ゛」というような並びであると、「ヌ」に+1した「ネ」に変換するということです。 この方法だと正常であるはずの半角「ウ゛」が「ウ」を+1した「エ」に変わってしまうことになるので、 例外的に全角の「ヴ」と変換するようにしています。 変換できない場合はそのまま、と言う処理にしたい場合はサンプルにもう少し手を加える必要が出てきます。 問題があるという場合は、書き換えてみてください。 コチラで紹介しているWinAPIの利用でも、半角カナを全角カナに変換できますが、 全角にする際、カナ以外の半角英数も全角英数に変換してしまいます。 英数の半角全角はそのままで置いておきたいという場合は、下記を参考に自分で実装してしまいましょう。

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

zenkana 対象変数
対象変数全角カナへの変換対象変数を指定する。
尚、変換結果はシステム変数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 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

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

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

 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
#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

#defcfunc zenkana var string, local rstr, local chk, local p
	sdim rstr, strlen(string) * 2 + 1
	repeat
		chk = wpeek(string, cnt)
		// 終了
		if chk = 0 : 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--
			  poke rstr, p, peek(rstr, p) + kpos((chk & $FF) - 166)
			} else {
			  // 「ヴ」
			  if chk = 57011 {
			    wpoke rstr, p, 38019
			    p += 2
			    continue cnt + 2
			  }
			  // 「ー」
			  if (chk & $FF) = 176 {
			    wpoke rstr, p, 23425
			  // その他のカナ
			  } else {
			    wpoke rstr, p, (kpos((chk & $FF) - 166) << 8) + 131
			  }
			  p++
			}
		// その他
		} else {
			poke rstr, p, chk & $FF
		}
		p++
	loop
	return rstr
#global

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