|
|
2010/6/28(Mon) 18:40:51|NO.33484
メッセージボックスに入力した文字列の中のunicodeだけを
\u0000の形式に変換して別のメッセージボックスに出力したいんです。
もしメッセージボックスに
晴れ☀のち曇り☁
曇り☁時々雨☂
という文字が入力されたら
晴れ\u2600のち曇り\u2601
曇り\u2601時々雨\u2602
という風になるようにです。
ですがどうやればできるのか全く見当もつきません。
どなたかご教授願います。
|
|
2010/6/28(Mon) 18:53:06|NO.33486
言いたいことはなんとなく察することができなくもないんですが、
"unicode" という語の使い方が不正確なために、質問自体が摩訶不思議な内容になってしまっています。
なので、質問者さん自身がまず 「"unicode" とは何ぞや」というところをもう少し明らかにしないといけない気がします。
|
|
2010/6/28(Mon) 19:31:56|NO.33488
>>ですがどうやればできるのか全く見当もつきません。
変換せずとも、そのまま別のメッセージボックスに、表示させることは
出来るのですか?
・・・・その見当も、付いていない様な気がしますが・・・・
|
|
2010/6/28(Mon) 21:17:20|NO.33490
SYAMさん、確かに質問が摩訶不思議でしたねすいません。
wikiで調べたのにもかかわらずunicodeの意味を間違って理解してました。
環境依存文字というのが正しい語ですよね。(?)
KAさん、今、javascriptで環境依存文字が混ざった文章を表示させたくて
環境依存文字だけを\u0000の形式に変換できるツール作りたいと思いました。
質問文に書くべきでした、すいません。
|
|
2010/6/29(Tue) 02:59:25|NO.33491
「文字列をmesboxにコピペしたものを変換する」と解釈しました。
「環境依存文字」のコード範囲は$2600〜$2602と仮定しています。
#uselib "user32.dll"
#func SendMessageW "SendMessageW" sptr,sptr,sptr,sptr
#define WM_GETTEXT 13
sdim buf,4096
mesbox buf,640,80
button "GO",*l_go
stop
*l_go
sdim buf2,4096
sendMessageW objinfo(0,2),WM_GETTEXT,4095,varptr(buf2): len=stat
sdim buf3,4096
p=0: q=0
repeat len
c=wpeek(buf2,p)
if c>=$2600 & c<=$2602 {
wpoke buf3,q,'\\': q+=2
wpoke buf3,q,'u': q+=2
wpoke buf3,q,'2': q+=2
wpoke buf3,q,'6': q+=2
wpoke buf3,q,'0': q+=2
wpoke buf3,q,(c&$f)+$30: q+=2
} else {
wpoke buf3,q,c
q+=2
}
p+=2
loop
sdim buf4,4096
buf4=cnvwtos(buf3)
mes buf4
stop
|
|
2010/6/29(Tue) 03:01:53|NO.33492
#define SIZE 70
;――――――――――――――――――――――――――――――――――――――――
; ユニコード文をmに作成
;――――――――――――――――――――――――――――――――――――――――
//※ユニコード文は2Byte単位で文字を読み込む為、文字によっては
//[00]=ASCIIやSJISにおける終端コードを含有している場合があるので
//strlen関数は使い物にならないので注意を(使うならstrsize変数を)
unicode_num.0=65279,51060,44163,51008,40,12371,12428,12399,41,32
unicode_num.10=50976,45768,53076,46300,51032,40,12518,12491,12467,12540
unicode_num.20=12489,12398,41,32,47928,51109,51077,45768,44620,63
unicode_num.30=40,25991,12391,12377,12363,65311,41,13,10,13
unicode_num.40=10,45348,44,40,12399,12356,12289,41,32,50976
unicode_num.50=45768,53076,46300,51077,45768,45796,46,40,12518,12491
unicode_num.60=12467,12540,12489,12391,12377,12290,41,0,0,0
sdim m,SIZE*2
repeat SIZE
wpoke m,cnt*2,unicode_num.cnt
loop
;――――――――――――――――――――――――――――――――――――――――
; mのデータを2ByteずつSJISに変更し、?になっている場合はコードを入れる
;――――――――――――――――――――――――――――――――――――――――
//※当然、元データの[?]もUnicode文字と誤解される
//後、最初の2Byte[FF,FE]はUnicodeの識別因子なのでパス
//Unicodeの識別因子は他にも[EF,BB,BF]とか色々あるのでそこら辺にも注意を
taiou
hsp_unicode_date=""
repeat SIZE-1,1
wpoke word_num,0,wpeek(m,cnt*2)
hsp_word=cnvwtos(word_num)
if hsp_word!"?" {
hsp_unicode_date=hsp_unicode_date+hsp_word
} else {
hsp_unicode_date=hsp_unicode_date+change_2byte(wpeek(m,cnt*2))
}
loop
mes hsp_unicode_date
stop
#module
#deffunc taiou
dol="0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"
return
;――――――――――――――――――――――――――――――――――――――――
; 2Byteのデータを\n****形式に変換する関数
;――――――――――――――――――――――――――――――――――――――――
//※同じ2Byteの16進数表記でも、一般的なバイナリエディタ上の表記とHSPのwpoke命令
//とでは若干表記が違ってくる
//例えばバイナリエディタで[83 AC]と書かれた文字をwpoke命令で表したい場合、
//wpoke 変数,オフセット,$AC83、と逆にする必要がある
//この関数ではHSP嬢の便宜を考えてwpoke型表記とする
#defcfunc change_2byte int num,local m
m="\\u"
a=num\16 : b=num/16\16 : c=num/256\16 : d=num/4096\16
return m+dol.d+dol.c+dol.b+dol.a
#global
非16Bit文字が無いという前提条件であれば、Unicode文字を_hammyu_さんの希望する型に
変更する事はこの関数(=change_2byte)で可能でしょう。(そもそも、\u****型にする以上、
16Bitを越える文字を表現しろというのも難しい話ですが)
ところで逆質問になりますけれども、HSPのmesbox命令で作るメッセージボックスは
Unicode文字を受け付けなかった(=強制的に?にする)はずです。一体、どうすればUnicodeの
文字も表せるメッセージボックスを作れるのでしょうか?
| |
|
2010/6/29(Tue) 11:29:06|NO.33493
ANTARESさん、木村さん回答ありがとうございます。
>>木村さん ANTARESさんの回答をもし見ていたらもうわかっているかもしれませんが
mesboxに環境依存文字をコピペしたときは「?」にならないので
どうにかなるんじゃないかと思っていました。
お二人のスクリプトを部分的に合体させたらすごくいいものができそうな気がしたのですが、
木村さんのスクリプトはユニコード文が配列変数という前提だったので
どこをいじっていいのかわからず、私には合体させることができませんでした。
もし良ければ力をお貸しいただけないでしょうか。
|
|
2010/6/29(Tue) 13:45:58|NO.33494
私はハタから見てるだけなんですが
どうしたいのか分からないのに力を貸すことは多分だれにもできないと思うのです。
「すごくいいもの」とは具体的にどんなものをお考えですか?
|
|
2010/6/29(Tue) 15:00:50|NO.33496
そうですね、また重要な所が抜けていますね、すいませんでした。
さっきと言ってる事変わりますが
ANTARESさん書いてくれたスクリプトは私にとってわかりやすくて
希望に近いものだったのですが、コードの範囲が$2600〜$2602と範囲が狭いです。
もし範囲を広げる事ができたら完璧なんですが
範囲を広げる事はできますか?
できれば「♥」なども「\u2665」となるようにしたいです。
|
|
2010/6/29(Tue) 19:47:36|NO.33497
「機種依存文字」と「記号」と「ユニコード」を(文字コード自体を)
ごっちゃに考えているような気が・・・
|
|
2010/6/29(Tue) 20:01:01|NO.33499
ANTARESさんのスクリプトの一部分を
s=strf("\\u%04x",c)
repeat 6
wpoke buf3,q,peek(s,cnt): q+=2
loop
こう書き換えても、とりあえず同じ動きになります。
これだと数字に変換する部分が(4桁になる範囲なら)どんな数値であっても変換できるようになります。この部分については。
…あとはわかりますよね?
|
|
2010/6/29(Tue) 20:37:21|NO.33500
つまりこう言う事でしょうか?
#uselib "user32.dll"
#func SendMessageW "SendMessageW" sptr,sptr,sptr,sptr
#define WM_GETTEXT 13
#define SIZE_MAX 4096
sdim buf,SIZE_MAX
mesbox buf,640,80
button gosub "GO",*l_go
oldobjet=-1
stop
*l_go
sdim buf2,SIZE_MAX
sendMessageW objinfo(0,2),WM_GETTEXT,SIZE_MAX-1,varptr(buf2): len=stat
hsp_unicode_date=""
repeat len
wpoke uni_word,0,wpeek(buf2,cnt*2)
hsp_word=cnvwtos(uni_word)
if hsp_word!"?" {
hsp_unicode_date+hsp_word
} else {
hsp_unicode_date+strf("\\u%04X",wpeek(buf2,cnt*2))
}
loop
if oldobjet!-1 : clrobj oldobjet,oldobjet
pos 0,120 : mesbox hsp_unicode_date,640,80 : oldobjet=stat
return
追伸:逆質問に答えてくださりありがとうございました。本当に、何であんな妙な質問を
してしまったのでしょうか……
|
|
2010/6/29(Tue) 20:56:50|NO.33501
木村さん、まさにその通りです、完璧すぎるスクリプトありがとうございます!
木村さんのレベルの高さにはいつも驚かされます。
よく見て勉強させてもらいますね。
KAさん、SYAMさんも返答ありがとうございます。
やたらとわがままな私に付き合ってくださりありがとうございました。
|
|