〜 テキスト 〜
アルファベットの大文字化・小文字化・大小反転

HSPの文字コードはシフトJISです。
シフトJISの半角英字Aは65、Bは66、Cは67…Zは90が割り振られています。
また、小文字半角aは97、bは98、cは99…zは122が割り振られています。


0 1 2 3 4 5 6 7 8 9
30

Space ! " # $ % & '
40 ( ) * + , - . / 0 1
50 2 3 4 5 6 7 8 9 : ;
60 < = > ? @ A B C D E
70 F G H I J K L M N O
80 P Q R S T U V W X Y
90 Z [ \ ] ^ _ ` a b c
100 d e f g h i j k l m
110 n o p q r s t u v w
120 x y z { | } ~


つまり、大文字の英字に32を足すと小文字に、小文字の英字に32を引けば大文字になることが分かります。 peek命令で各位置のコードを調べ、英字の範囲内なら処理するようにすれば英字のみ操作できますね。 WinAPIを用いて変換したい方は、コチラでも使用している「LCMapString」を利用してみてください。

mojichange 対象文字列, タイプ
対象文字列255バイト以下の変換対象の文字列、または文字列型変数を指定する。
タイプ変換タイプ(0:大文字化 1:小文字化 2:大小反転)を指定する。

 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
#module
#deffunc mojichange str, int
	mref txt, 32 : mref type, 1
	mref s, 65
	s = txt
	strlen len, s
	repeat len
		peek chk, s, cnt
		if (chk > 128 & (chk < 160)) | (chk > 223) : continue cnt + 2 // 2バイト文字
		if (chk >= 'a') & (chk <= 'z') {
			if (type = 0) | (type = 2) : chk -= 32 // 大文字化
		} else {
			if (chk >= 'A') & (chk <= 'Z') {
			  if (type = 1) | (type = 2) : chk += 32 // 小文字化
			}
		}
		poke s, cnt, chk
	loop
	return
#global

	sdim msg, 9, 3
	msg = "大文字化", "小文字化", "大小反転"
	buf = "aBcdeFGHijKlmnOpQRstuvwxYZ"
	mes buf + "\n---------------------------"
	repeat 3
		mojichange buf, cnt        // 1回目は大文字化,2回目は小文字化,3回目は反転
		mes msg.cnt + " " + refstr // refstrに結果が入る
	loop
	stop

結果 = mojichange(文字列, タイプ)
結果指定タイプにより、変換した文字列を返す。
文字列変換対象の文字列、または文字列型変数を指定する。
タイプ変換タイプ(0:大文字化 1:小文字化 2:大小反転)を指定する。

 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
#module
#defcfunc mojichange str txt, int type, local s, local chk
	s = txt
	repeat strlen(s)
		chk = peek(s, cnt)
		if (chk > 128 & (chk < 160)) || (chk > 223) : continue cnt + 2 // 2バイト文字
		if (chk >= 'a') & (chk <= 'z') {
			if (type = 0) | (type = 2) : chk -= 32 // 大文字化
		} else {
			if (chk >= 'A') & (chk <= 'Z') {
			  if (type = 1) | (type = 2) : chk += 32 // 小文字化
			}
		}
		poke s, cnt, chk
	loop
	return s
#global

	sdim msg, 9, 3
	msg = "大文字化", "小文字化", "大小反転"
	buf = "aBcdeFGHijKlmnOpQRstuvwxYZ"
	mes buf + "\n---------------------------"
	repeat 3
		mes msg.cnt + " " + mojichange(buf, cnt) // 変数内の英字を変換
	loop