〜 テキスト 〜
SJISをJISに変換

HSP標準で扱うShift-JIS(SJIS)コードを、JIS(ISO−2022−JP)に変換します。
尚、下記サンプルモジュールは、バッファオーバーフロートラップを設けていません。
JISコードは半角から全角、全角から半角に切り替わる際に、エスケープコードが必要となりますので、
設定先の変数サイズは、元の変数の文字列サイズより大きく確保しておく必要があります。
HSP3からは、HSPの機能によりメモリの自動確保機能がありますが、
poke命令を用いて直接書き込んでいるため、バッファサイズの自動拡張は行いません。
注意しましょう。
	

sjistojis 設定先変数, 変換元変数
設定先変数変換したJISコードテキストを格納する変数を指定する。
変換元変数JISコードに変換するSJISコードテキストを格納した変数を指定する。

 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
#module
#deffunc sjistojis val, val
	mref jis, 24 : mref sjis, 25
	wbite = 0 // 2バイト文字フラグ
	i = 0     // 書込先インデクス
	strlen len, sjis
	repeat len
		peek code.0, sjis, cnt
		// 2バイト文字
		if (code.0 > 128 & (code.0 < 160)) | (code.0 > 223) {
			// 2バイト開始エスケープシーケンス(KI)
			if wbite = 0 {
			  wbite = 1
			  poke jis, i + 0, 0x1b
			  poke jis, i + 1, 0x24
			  poke jis, i + 2, 0x42
			  i += 3
			}
			// コード変換
			peek code.1, sjis, cnt + 1
			if code.0 <= 0x9f : code.0 -= 0x71 : else : code.0 -= 0xb1
			code.0 = code.0 * 2 + 1
			if code.1 >= 0x7f : code.1--
			if code.1 >= 0x9e {
			  code.0++
			  code.1 -= 0x7d
			} else {
			  code.1 -= 0x1f
			}
			wpoke jis, i, (code.1 << 8) + code.0
			i += 2
			continue cnt + 2
		}
		// 2バイト終了エスケープシーケンス(KO)
		if wbite {
			wbite = 0
			poke jis, i + 0, 0x1b
			poke jis, i + 1, 0x28
			poke jis, i + 2, 0x42
			i += 3
		}
		// 1バイト文字
		poke jis, i, code.0
		i++
	loop
	return
#global

	sdim string, 256, 2
	objsize winx, 25
	button "保存する", *save
	mesbox string, winx, winy - 25, 5
	stop

*save
	sjistojis string.1, string.0
	dialog "txt", 17, "Sjisからコード変換したJisテキスト"
	if stat {
		dialog "保存しました。\nJISコードを読めるエディタで確認してください。"
		notesel string.1
		notesave refstr
	}
	stop

sjistojis 設定先変数, 変換元変数
設定先変数変換したJISコードテキストを格納する変数を指定する。
変換元変数JISコードに変換するSJISコードテキストを格納した変数を指定する。

 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
#module
#deffunc sjistojis var jis, var sjis, local wbite, local i, local code
	repeat strlen(sjis)
		code.0 = peek(sjis, cnt)
		// 2バイト文字
		if (code.0 > 128 & code.0 < 160) | code.0 > 223 {
			// 2バイト開始エスケープシーケンス(KI)
			if wbite = 0 {
			  wbite = 1
			  poke jis, i + 0, 0x1b
			  poke jis, i + 1, 0x24
			  poke jis, i + 2, 0x42
			  i += 3
			}
			// コード変換
			code.1 = peek(sjis, cnt + 1)
			if code.0 <= 0x9f : code.0 -= 0x71 : else : code.0 -= 0xb1
			code.0 = code.0 * 2 + 1
			if code.1 >= 0x7f : code.1--
			if code.1 >= 0x9e {
			  code.0++
			  code.1 -= 0x7d
			} else {
			  code.1 -= 0x1f
			}
			wpoke jis, i, (code.1 << 8) + code.0
			i += 2
			continue cnt + 2
		}
		// 2バイト終了エスケープシーケンス(KO)
		if wbite {
			wbite = 0
			poke jis, i + 0, 0x1b
			poke jis, i + 1, 0x28
			poke jis, i + 2, 0x42
			i += 3
		}
		// 1バイト文字
		poke jis, i, code.0
		i++
	loop
	return
#global

	sdim string, 3200, 2 // 足りない場合はサイズを大きくしてください
	objsize ginfo_winx, 25
	button gosub "保存する", *save
	mesbox string, ginfo_winx, ginfo_winy - 25
	stop

*save
	sjistojis string.1, string.0
	dialog "txt", 17, "Sjisからコード変換したJisテキスト"
	if stat {
		dialog "保存しました。\nJISコードを読めるエディタで確認してください。"
		notesel string.1
		notesave refstr
	}
	return