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

英数字同様、かなもある一定の規則に従ってアスキーコードが割り振られています。
ひらがなは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
全角カナの「ミ」と「ム」の間が開いていたり、「ン」の後に「ヴ」「ヵ」「ヶ」が存在したりするので、 ひらがなとカタカナは単純に文字コードをシフトするだけでは変換できません。 「ム」以降が1つ分ずれることに関しては、同様に1つ分ずらせば問題解決できますが、 「ヴ」「ヵ」「ヶ」は、ひらがなに存在しないわけですから、どう置き換えるかを考える必要があります。 変換テーブルを用いたり存在しない文字の時だけ、別の文字に置き換えてみたり、 これらの文字はそのまま置いておくのも1つの策でしょう。 WinAPIの形式を選択するだけで簡単に変換できるものは、「変換しない」策を取っているようです。 詳しくはコチラのスクリプトを参照の上、お試しください。、

katatohira 対象変数
対象変数平仮名に変換するカタカナの含んだ文字列型変数を指定する。
尚、変換結果はシステム変数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 katatohira 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 = 131) & (chk >> 8 >= 64) & (chk >> 8 <= 147) {
			  // ひらがな1バイト目
			  chk--
			  // ひらがなとカタカナの差95だけずらし、「ム」以降は1増やす
			  chk += (95 - (chk >> 8 >= 128)) << 8
			}
			wpoke rstr, cnt, chk
			continue cnt + 2
		// 半角の場合
		} else {
			poke rstr, cnt, chk & $FF
		}
	loop
	poke rstr, chk // ゴミ表示を防ぐ
	return
#global

	sdim data, 128
	data = "12345あガさダナパマヤらゎワゐヲゑンヴヵヶーーAbCdEfG"
	font "MS 明朝", 16
	mes "元の文字列  " + data
	katatohira data
	mes "平仮名へ変換 " + refstr
	stop

katatohira 対象変数
対象変数平仮名に変換するカタカナの含んだ文字列型変数を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
23
24
25
26
27
28
29
30
#module
#defcfunc katatohira 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) = 131 & (chk >> 8) >= 64 & (chk >> 8) <= 147 {
			  // ひらがな1バイト目
			  chk--
			  // ひらがなとカタカナの差95だけずらし、「ム」以降は1増やす
			  chk += (95 - (chk >> 8 >= 128)) << 8
			}
			wpoke rstr, cnt, chk
			continue cnt + 2
		// 半角の場合
		} else {
			poke rstr, cnt, chk & $FF
		}
	loop
	return rstr
#global

	sdim data, 128
	data = "12345あガさダナパマヤらゎワゐヲゑンヴヵヶーーAbCdEfG"
	font "MS 明朝", 16
	mes "元の文字列  " + data
	mes "平仮名へ変換 " + katatohira(data)