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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0628
_hamyuu_unicodeを16進数に変換したい12解決


_hamyuu_

リンク

2010/6/28(Mon) 18:40:51|NO.33484

メッセージボックスに入力した文字列の中のunicodeだけを
\u0000の形式に変換して別のメッセージボックスに出力したいんです。
もしメッセージボックスに

晴れ☀のち曇り☁
曇り☁時々雨☂

という文字が入力されたら

晴れ\u2600のち曇り\u2601
曇り\u2601時々雨\u2602

という風になるようにです。
ですがどうやればできるのか全く見当もつきません。
どなたかご教授願います。



この記事に返信する


SYAM

リンク

2010/6/28(Mon) 18:53:06|NO.33486

言いたいことはなんとなく察することができなくもないんですが、
"unicode" という語の使い方が不正確なために、質問自体が摩訶不思議な内容になってしまっています。

なので、質問者さん自身がまず 「"unicode" とは何ぞや」というところをもう少し明らかにしないといけない気がします。



KA

リンク

2010/6/28(Mon) 19:31:56|NO.33488

>>ですがどうやればできるのか全く見当もつきません。

 変換せずとも、そのまま別のメッセージボックスに、表示させることは
 出来るのですか?

 ・・・・その見当も、付いていない様な気がしますが・・・・



_hamyuu_

リンク

2010/6/28(Mon) 21:17:20|NO.33490

SYAMさん、確かに質問が摩訶不思議でしたねすいません。
wikiで調べたのにもかかわらずunicodeの意味を間違って理解してました。
環境依存文字というのが正しい語ですよね。(?)

KAさん、今、javascriptで環境依存文字が混ざった文章を表示させたくて
環境依存文字だけを\u0000の形式に変換できるツール作りたいと思いました。
質問文に書くべきでした、すいません。



ANTARES

リンク

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の
文字も表せるメッセージボックスを作れるのでしょうか?



_hamyuu_

リンク

2010/6/29(Tue) 11:29:06|NO.33493

ANTARESさん、木村さん回答ありがとうございます。

>>木村さん ANTARESさんの回答をもし見ていたらもうわかっているかもしれませんが
mesboxに環境依存文字をコピペしたときは「?」にならないので
どうにかなるんじゃないかと思っていました。

お二人のスクリプトを部分的に合体させたらすごくいいものができそうな気がしたのですが、
木村さんのスクリプトはユニコード文が配列変数という前提だったので
どこをいじっていいのかわからず、私には合体させることができませんでした。
もし良ければ力をお貸しいただけないでしょうか。



SYAM

リンク

2010/6/29(Tue) 13:45:58|NO.33494

私はハタから見てるだけなんですが
どうしたいのか分からないのに力を貸すことは多分だれにもできないと思うのです。

「すごくいいもの」とは具体的にどんなものをお考えですか?



_hamyuu_

リンク

2010/6/29(Tue) 15:00:50|NO.33496

そうですね、また重要な所が抜けていますね、すいませんでした。

さっきと言ってる事変わりますが
ANTARESさん書いてくれたスクリプトは私にとってわかりやすくて
希望に近いものだったのですが、コードの範囲が$2600〜$2602と範囲が狭いです。

もし範囲を広げる事ができたら完璧なんですが
範囲を広げる事はできますか?
できれば「♥」なども「\u2665」となるようにしたいです。



KA

リンク

2010/6/29(Tue) 19:47:36|NO.33497

「機種依存文字」と「記号」と「ユニコード」を(文字コード自体を)
ごっちゃに考えているような気が・・・



SYAM

リンク

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


追伸:逆質問に答えてくださりありがとうございました。本当に、何であんな妙な質問を
してしまったのでしょうか……



_hamyuu_

リンク

2010/6/29(Tue) 20:56:50|NO.33501

木村さん、まさにその通りです、完璧すぎるスクリプトありがとうございます!
木村さんのレベルの高さにはいつも驚かされます。
よく見て勉強させてもらいますね。

KAさん、SYAMさんも返答ありがとうございます。
やたらとわがままな私に付き合ってくださりありがとうございました。



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