;================================================================================ ;モジュール unicode ;ver 1.0 ; Unicode関連 ; llmod.asが必要です ;================================================================================ ; uni_multiモジュールの命令一覧 ; ; to_uni Unicodeへ変換 ; from_uni UnicodeからANSIに変換 ; ; 計 2個 ;使い方 ;================================================================================ ; to_uni v1,v2,n3 Unicodeへ変換 ; ; v1 : Unicodeを格納する変数 ; v2 : Unicodeに変換する文字列変数 ; n3 : Unicodeに変換する文字列の長さ ;================================================================================ ; ;<>説明 ; ANSI文字列(SJIS)をUNICODEに変換します。 ; ;<>この命令を呼び出した後のstatの値 ; バッファに書き込まれたUnicode文字の数 ; 0 変換失敗 ; ;<>例 ; s="Unicodeに変換する文字列" ; strlen sl,s ; ;alloc buf,(sl+1)*2 ;この場合(sl+1)*2が64に満たないのでallocは必要ない ; to_uni buf,s,sl+1 ; usize=stat ; if usize=-1 : dialog "エラーが発生しました" ; if usize=0 : dialog "変換が失敗しました" ; if usize>0 : bsave "unicode.dat",buf,usize*2 ; ;<>備考 ; unicode呼び出し後にstatに入る値の'バッファに書き込まれたUnicode文字の数'は、 ; 1バイト(半角)文字は1文字、2バイト(全角)文字も1文字 ; と数えます。例えば ; s="abcあいう" ; をすべてUnicodeに変換したあとのstat値は6+1(*注 +1は最後の文字列終結文字ぶん)。 ; となります。 ; ; 'Unicodeに変換する文字列の長さ'を-1にすると指定した文字列全てを変換します。 ; 'Unicodeに変換する文字列の長さ'を0にするとUnicodeを格納するのに必要な変数 ; のサイズを返します。(バイト単位) ; ;================================================================================ ; from_uni v1,v2,n3 UnicodeからANSIに変換 ; ; v1 : Multibyteを格納する変数 ; v2 : Multibyteに変換するUnicode文字列が入っている変数 ; n3 : Multibyteに変換するUnicode文字列の長さ ;================================================================================ ; ;<>説明 ; UNICODEをANSI文字列に変換します。 ; ;<>この命令を呼び出した後のstatの値 ; バッファに書き込まれたMultibyte文字の数 ; 0 変換失敗 ; ;<>例 ; exist "unicode.dat" ; bload "unicode.dat",uni,strsize ; buf="" ; from_uni buf,uni,-1 ; mbsize=stat ; if mbsize=-1 : dialog "エラーが発生しました" ; if mbsize=0 : dialog "変換が失敗しました" ; if mbsize>0 : dialog buf ; ;<>備考 ; この命令を呼び出した後のstatの値、'バッファに書き込まれたMultibyte文字の数'は ; 1バイト(半角)文字は1文字、2バイト(全角)文字は2文字 ; と数えます。 ; ; 'Multibyteに変換するUnicode文字列の長さ'を-1にすると全て変換します。 ; 'Multibyteに変換するUnicode文字列の長さ'を0にするとMultibyteを格納するのに ; 必要な変数のサイズを返します。(バイト単位) ; ;module始め>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> #module "unicode" ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;to_uni ;Unicodeへ変換 ;................................................................................ #deffunc to_uni val,val,int mref buf,16 ;Unicodeを格納するバッファ mref mb,25 ;Unicodeに変換する文字列変数 mref mb_len,2 ;Unicodeに変換する文字列の長さ mref stt,64 strlen lcl_mb_len,mb if lcl_mb_len>=64 : sdim lcl_mb,lcl_mb_len+1 lcl_mb=mb ;保存しておかないとまずい prm.0=0 prm.1=0 getptr prm.2,lcl_mb prm.3=mb_len if mb_len=0 { prm.5=0 : prm.3=-1 } else prm.5=(lcl_mb_len+1)*2 getptr prm.4,buf ;@@@@ Unicodeに変換 @@@@ dllproc "MultiByteToWideChar",prm,6,D_KERNEL ; if stat<0 : stt=-1 : return prm=stat if prm.5=0 : prm=prm*2 stt=prm return ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;from_uni ;UnicodeからANSIへ変換 ;................................................................................ #deffunc from_uni val,val,int mref buf,24 ;Multibyteを格納するバッファ mref uni,17 ;Multibyteに変換するUnicode文字列 mref uni_len,2 ;Multibyteに変換するUnicode文字列の長さ mref stt,64 prm=0 repeat -1 wpeek prm,uni,cnt*2 if prm=0 : lcl_uni_len=cnt : break loop prm.0=0 prm.1=0 getptr prm.2,uni prm.3=uni_len getptr prm.4,buf if uni_len=0 { prm.5=0 prm.3=-1 } else prm.5=(lcl_uni_len+1)*2 ;<-ほんとは違う prm.6=0 prm.7=0 ;@@@@ Multibyteに変換 @@@@ dllproc "WideCharToMultiByte",prm,8,D_KERNEL return #global ;module終わり>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>