HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2022
0104
MSX68000ファイル名に使える文字か判定する方法3解決


MSX68000

リンク

2022/1/4(Tue) 14:17:20|NO.94872

 先日のデータ保存の質問ではありがとうございました。
memcpyの方が上手くやるとコンパクトに収まりそうですが、処理の簡単さから、
全部文字列保存でする見通しがつきました。

 で、そこで新たに生まれた疑問。

 キャラクターの名は現在、キーボードから打ち込める字を全部使用可能にしているの
ですが、SAVEデータにファイル名を付ける場合、キャラ名を使うなり、キャラ名と別にするなり、ファイル名で使える字かどうかのチェックが必要になります。

 他の言語でいう所のalphabeticやnumericの様な関数はあるのでしょうか?
それともinstr(文字列,,"abcde...xyz")みたいな関数を自作するとか?
(全開の質問同様、HSP3なら簡単な方法は存在すると思うのだが…)



この記事に返信する


沢渡

リンク

2022/1/4(Tue) 15:58:53|NO.94876

>alphabeticやnumericの様な関数
一体どんなものなのか軽くググってみましたが、つまり「英数字以外の文字は削除したい」
ということでしょうか?
別スレで借用したコードにあったAPIを利用して以下のようなモジュールを作ってみました。
ついでに「全角文字を半角に変換」「大文字を小文字に変換」という処理も行っています。

#include "kernel32.as" #include "user32.as" #module #const LOCALE_SYSTEM_DEFAULT 0x800 #const LCMAP_HALFWIDTH 0x400000 #defcfunc alfnum str _s,local s,local res w=strlen(_s)+1 : sdim s,w LCMapString LOCALE_SYSTEM_DEFAULT,LCMAP_HALFWIDTH,_s,-1,varptr(s),w //↑の2行は全角文字を半角に変換する処理。不要なら削除の上、以下を実行してください。 //s=_s w=strlen(s) : sdim res,w+1 : p=0 repeat w x=peek(s,cnt) //元の文字列のcntバイト目を取り出す IsDBCSLeadByte x : if stat : continue cnt+2 //「2バイト文字の1バイト目」の場合は2バイト後に飛ぶ IsCharAlphaNumeric x : if stat=0 : continue //アルファベットでも数字でもない場合は次のバイトへ poke res,p,x : p++ //結果に出力 loop CharLower varptr(res) //大文字を小文字に変換(不要ならこの行は削除してください) return res #global //以下、使用例 mes alfnum("あ1い2う3えAおbかcXYZ") //「123abcxyz」と表示される



猪野

リンク

2022/1/4(Tue) 20:19:54|NO.94880

専用の命令/関数は存在しないので自作する必要があります。
手軽にやるなら正規表現でしょうか。

#include "mod_regexp.as" #define global ctype alphabetic(%1) replace(%1,"[^A-Za-z]","") #define global ctype numeric(%1) replace(%1,"\\D","") #define global ctype safeName(%1) replace(%1,"\\W","") name="a1:b2_c3?d4" mes alphabetic(name) mes numeric(name) mes safeName(name)



MSX68000

リンク

2022/1/4(Tue) 23:50:44|NO.94882

沢渡さん、猪野さん

 ありがとうございます。それ専用命令は無いという事ですね。

 数字・英字の大文字と小文字・アンダーバーの計63種類ぐらいなら、自作処理でチェック
出来そうなので、キャラ名と別に保存ファイル名を作る処理で行こうと思います。



ONION software Copyright 1997-2023(c) All rights reserved.