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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0530
MSX68000半角文字列を全角文字列に変える方法7解決


MSX68000

リンク

2020/5/30(Sat) 23:19:11|NO.90667

 はあるでしょうか?

 PC-9801では文字列関数で出来たと思うのですが、HSPではヘルプファイルやプログラミング
書籍を調べても、まだ見つかっていません。



この記事に返信する


あらや

リンク

2020/5/30(Sat) 23:46:24|NO.90668

HSPの標準命令であるかどうかという質問ならば無かったかと。

他の方法で可能かという質問ならば、可能です。

大きく分けて2つありますが、

・自前で変換命令を作成するという方法。

・既存の外部プラグインを使用する方法。

この2通りになります。

自前でやる場合は各文字に対応する
半角・全角文字に置換するという少々面倒な方法。

既存の外部プラグインを使用する場合は
Windows APIのLCMapString関数を使用すると比較的簡単かと思います。
APIの詳しい説明は公式サイトをご覧ください。
https://docs.microsoft.com/ja-jp/windows/win32/api/winnls/nf-winnls-lcmapstringa



MSX68000

リンク

2020/5/31(Sun) 03:59:41|NO.90670

 うわー!これぐらいあるかと思ったら、自力実装なのか!(^^;
とりあえず真相はわかったので、いろいろ工夫とか代償手段を考えてみます。



MSX68000

リンク

2020/5/31(Sun) 09:17:41|NO.90671

 ぼーっとしていて、ふと思いつきました!実は今回、半角→全角変換をしたいのは数字だけ
なので(コマンド入力ゲームで能力値を2バイト日本語文字と同時に出力したいため)

1.引数で数字を持ってくる(例:「256」)
2.数字を文字列にして一文字ずつ切り出す(例:「2」「5「6」)
3.2バイト変換用の文字列「0123456789」を持っておき
 2の数字とstrmid関数からどの位置を切り出すか相対的に決定する
4.3の結果を出力文字列にためておき、returnで帰り値にする

 これで何とか行けそうです。



沢渡

リンク

2020/5/31(Sun) 11:17:28|NO.90672

LCMapStringを使ったモジュールを作ってみました。
全角/半角の変換の他、ひらがな/カタカナ、大文字/小文字の変換にも対応しています。

#include "kernel32.as" #module //mapstr(p1,p2) //p1の文字列を、p2に指定した変換タイプに従って変換したものを取得する。 //変換タイプには以下の数値を指定する。数値を足すことで同時に指定可能。 // 1:小文字に変換 // 2:大文字に変換 // 4:ひらがなに変換 // 8:カタカナに変換 // 16:半角に変換 // 32:全角に変換 #defcfunc mapstr str _s,int type,local s,local res s=_s t=0 if type&1 : t|=0x100 //LCMAP_LOWERCASE 小文字に変換 if type&2 : t|=0x200 //LCMAP_UPPERCASE 大文字に変換 if type&4 : t|=0x100000 //LCMAP_HIRAGANA ひらがなに変換 if type&8 : t|=0x200000 //LCMAP_KATAKANA カタカナに変換 if type&16 : t|=0x400000 //LCMAP_HALFWIDTH 半角に変換 if type&32 : t|=0x800000 //LCMAP_FULLWIDTH 全角に変換 LCMapString 0x800,t,varptr(s),-1,0,0 //LOCALE_SYSTEM_DEFAULT=0x800 if stat=0 : return s len=stat sdim res,len LCMapString 0x800,t,varptr(s),-1,varptr(res),len return res #global //以下、使用例 mes mapstr("256",32) mes mapstr("0123456789abcdefghijklmnopqrstuvwxyz",34) mes mapstr("いろはにほへとちりぬるをわかよたれそつねならむ",24) mes mapstr("ガギグゲゴ",36)



沢渡

リンク

2020/5/31(Sun) 11:18:55|NO.90673

数字だけを全角にしたいのでしたら、こういう方法も。

#module //fwidnum(p1) //p1の文字列の中から、半角の数字を全角に変換して返す。 #defcfunc fwidnum str _s,local s,local temp,local res s=_s w=strlen(s) sdim temp,w*2 c=0 repeat w x=peek(s,cnt) if (x>=0x30)&(x<=0x39) { poke temp,c,0x82 poke temp,c+1,0x1F+x c+=2 } else { poke temp,c,x c++ } loop sdim res,c+1 memcpy res,temp,c,0,0 return res //fwidnum_i(p1) //p1に指定した整数値を、全角に変換した文字列にして返す。 #defcfunc fwidnum_i int i,local s2 s2=str(i) return fwidnum(s2) #global mes fwidnum_i(256) mes fwidnum("01234567890ABCDEFGHIJKLMN")



沢渡

リンク

2020/5/31(Sun) 11:32:21|NO.90674

すみません、NO.90672のコードですが、トラブル回避のためにロケールIDに日本語を
指定するようにしたので、以下のものに置き換えてください。

#include "kernel32.as" #module //mapstr(p1,p2) //p1の文字列を、p2に指定した変換タイプに従って変換したものを取得する。 //変換タイプには以下の数値を指定する。数値を足すことで同時に指定可能。 // 1:小文字に変換 // 2:大文字に変換 // 4:ひらがなに変換 // 8:カタカナに変換 // 16:半角に変換 // 32:全角に変換 #defcfunc mapstr str _s,int type,local s,local res s=_s t=0 if type&1 : t|=0x100 //LCMAP_LOWERCASE 小文字に変換 if type&2 : t|=0x200 //LCMAP_UPPERCASE 大文字に変換 if type&4 : t|=0x100000 //LCMAP_HIRAGANA ひらがなに変換 if type&8 : t|=0x200000 //LCMAP_KATAKANA カタカナに変換 if type&16 : t|=0x400000 //LCMAP_HALFWIDTH 半角に変換 if type&32 : t|=0x800000 //LCMAP_FULLWIDTH 全角に変換 LCMapString 0x0411,t,varptr(s),-1,0,0 //日本語のロケールID=0x0411 if stat=0 : return s len=stat sdim res,len LCMapString 0x0411,t,varptr(s),-1,varptr(res),len return res #global //以下、使用例 mes mapstr("256",32) mes mapstr("0123456789abcdefghijklmnopqrstuvwxyz",34) mes mapstr("いろはにほへとちりぬるをわかよたれそつねならむ",24) mes mapstr("ガギグゲゴ",36)



MSX68000

リンク

2020/6/21(Sun) 22:17:19|NO.90830

 忘れたころのレスですが(^^;他の部分のプログラミングがうまく行かなかったので
こっちをいじったら、あっさり完成しました。参考としてリスト掲載です。

===

a=256
mes a

mes

b=n1to2(a)
mes b
stop
;↑★呼び出すサンプルプログラム
;↓★呼び出される開発プログラム
#defcfunc n1to2 int la ;数字1→2バイト変換
lr="":ls=str(la):b2="0123456789"
repeat strlen(ls):j=int(strmid(ls,cnt,1)):b3=strmid(b2,j*2,2):lr=lr+b3:loop
return lr



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