〜 テキスト 〜
平仮名をカタカナに変換

英数字同様、かなもある一定の規則に従ってアスキーコードが割り振られています。
ひらがなは2バイト文字であり、1バイト目は130固定、2バイト目が159から1ずつ増加。
全角かなも2バイト文字で、1バイト目は131固定、2バイト目が64から同様に1ずつ増加します。
コード0123456789
15X
16X
17X
18X
19X
20X
21X
22X
23X
24X
コード0123456789
 6X
 7X
 8X
 9X
10X
11X
12X
13X
14X
15X
全角カナの「ミ」と「ム」の間が開いていたり、「ン」の後に「ヴ」「ヵ」「ヶ」が存在したりするので、 ひらがなとカタカナは単純に文字コードをシフトするだけでは変換できません。 変換テーブルを用いるか、コード配置に沿うよう適時処理を分岐させて変換しましょう。 WinAPIには、形式を選択するだけで簡単に変換できるものが存在しますので、 コチラを利用するのも1つの手です。

hiratokata 対象変数
対象変数カタカナに変換する平仮名の含んだ文字列型変数を指定する。
尚、変換結果はシステム変数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
#module
#deffunc hiratokata val
	mref string, 24
	mref rstr, 65
	repeat
		wpeek chk, string, cnt
		// 終了
		if chk = 0 : chk = cnt : break
		// 全角の場合
		if (chk & $FF > 128) & (chk & $FF < 160) | (chk & $FF > 223) {
			// ひらがなの場合
			if (chk & $FF = 130) & (chk >> 8 >= 159) & (chk >> 8 <= 241) {
			  // カタカナ1バイト目
			  chk++
			  // ひらがなとカタカナの差95だけずらし、「ム」以降は1戻す
			  chk -= (95 - (chk >> 8 >= 222)) << 8
			}
			wpoke rstr, cnt, chk
			continue cnt + 2
		// 半角の場合
		} else {
			poke rstr, cnt, chk & $FF
		}
	loop
	poke rstr, chk // ゴミ表示を防ぐ
	return
#global

	sdim data, 128
	font "MS 明朝", 16
	data = "12345あガさダナパマヤらゎワゐヲゑンヴヵヶーーAbCdEfG"
	hiratokata data
	mes "元   " + data
	mes "片仮名 " + refstr
	stop

受取先 = hiratokata(対象変数)
受取先平仮名からカタカナに変換された文字列の受取先を指定する。
対象変数カタカナに変換する平仮名の含んだ文字列型変数を指定する。

 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
#module
#defcfunc hiratokata var string, local rstr, local chk
	sdim rstr, strlen(string) + 1
	repeat
		chk = wpeek(string, cnt)
		// 終了
		if chk = 0 : chk = cnt : break
		// 全角の場合
		if (chk & $FF) > 128 & (chk & $FF) < 160 | (chk & $FF) > 223 {
			// ひらがなの場合
			if (chk & $FF) = 130 & (chk >> 8) >= 159 & (chk >> 8) <= 241 {
			  // カタカナ1バイト目
			  chk++
			  // ひらがなとカタカナの差95だけずらし、「ム」以降はさらに1ずらす
			  chk -= (95 - (chk >> 8 >= 222)) << 8
			}
			wpoke rstr, cnt, chk
			continue cnt + 2
		// 半角の場合
		} else {
			poke rstr, cnt, chk & $FF
		}
	loop
	return rstr
#global

	sdim data, 128
	font "MS 明朝", 16
	data = "12345あガさダナパマヤらゎワゐヲゑンヴヵヶーーAbCdEfG"
	mes "元   " + data
	mes "片仮名 " + hiratokata(data)