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

UNIX系のワークステーションで用いられるEUC(EUC-JP)コードを、
HSP標準で扱うShift-JIS(SJIS)コードに変換します。
尚、下記サンプルモジュールは、バッファオーバーフロートラップを設けていませんので、
エラーを出さないためにも、設定先の変数サイズは大きく確保しておく必要があります。
SJISコードは、半角カナが1バイトで済みますが、改行は2バイトとなりますので、
設定先変数サイズは元の文字列変数サイズの2倍分にしておけばオーバーフローしません。
HSP3からは、HSPの機能によりメモリの自動確保機能がありますが、
poke命令を用いて直接書き込んでいるため、バッファサイズの自動拡張は行いません。注意しましょう。
	

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

 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
#module
#deffunc euctosjis val, val
	mref sjis, 24 : mref euc, 25
	strlen len, euc
	i = 0
	repeat len
		peek code, euc, cnt
		// LF → CR + LF
		if code = 10 : poke sjis, i, 13 : i++
		// 2バイト・半角カナ文字
		if code > 127 {
			peek code.1, euc, cnt + 1 // 2バイト・半角カナ文字の下位バイト取得
			if code = 142 : poke sjis, i, code.1 : i++ : continue cnt + 2 // 半角カナ文字
			if code \ 2 = 0 : code.1 -= 2 : else : code.1 -= 97 : if code.1 > 125 : code.1++
			poke sjis, i + 0, code + 1 / 2 + ((code >= 223) * 64) + 48
			poke sjis, i + 1, code.1
			i += 2
			continue cnt + 2
			// 1バイト文字
		} else {
			poke sjis, i, code
		}
		i++
	loop
	return
#global

	dialog "txt", 16, "EUC形式のファイル"
	if stat {
		notesel buf
		noteload refstr
		strlen size, buf
		sdim buf2, size * 2
		euctosjis buf2, buf
		mesbox buf2, winx, winy, 5
		stop
	}

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

 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
#module
#deffunc euctosjis var sjis, var euc
	i = 0
	repeat strlen(euc)
		code = peek(euc, cnt)
		// LF → CR + LF
		if code = 10 : poke sjis, i, 13 : i++
		// 2バイト・半角カナ文字
		if code > 127 {
			code.1 = peek(euc, cnt + 1) // 2バイト・半角カナ文字の下位バイト取得
			if code = 142 : poke sjis, i, code.1 : i++ : continue cnt + 2 // 半角カナ文字
			if code \ 2 = 0 : code.1 -= 2 : else : code.1 -= 97 : if code.1 > 125 : code.1++
			poke sjis, i + 0, (code + 1) / 2 + (code >= 223) * 64 + 48
			poke sjis, i + 1, code.1
			i += 2
			continue cnt + 2
			// 1バイト文字
		} else {
			poke sjis, i, code
		}
		i++
	loop
	return
#global

	dialog "txt", 16, "EUC形式のファイル"
	if stat = 0 : end
	notesel buf
	noteload refstr
	sdim buf2, strlen(buf) * 2
	euctosjis buf2, buf
	mesbox buf2, ginfo_winx, ginfo_winy, 5