hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
小ワザ/Win32API関連/Unicodeのデータをmes命令のように表示する - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

小ワザ/Win32API関連/Unicodeのデータをmes命令のように表示する

	
最終更新日 : 2010-07-27 (火) 03:49:19

 Unicodeのデータ自体を操作するだけならHSP3でも十分可能なのだが、mes命令のようにUnicode文字を表示するにはWin32APIの力が現状(=ver3.2時点)では必要である。

実装用モジュール

HSP3掲示板No,419kou様提示のスクリプトの丸写し by 木村


Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
 
 
 
 
 
 
 
    #include "user32.as"
    #module
        #deffunc mesW var p1, local p //Unicode対応のAPIを使う
            p.0 = ginfo_cx@, ginfo_cy@, ginfo_winx@, ginfo_winy@
            DrawTextW@ hdc,varptr(p1),-1,varptr(p),0
        return
    #global

実用例


Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
    ;――――――――――――――――――――――――――――――――――――――――
    ;		実装部分を定義
    ;――――――――――――――――――――――――――――――――――――――――
    #include "user32.as"
    #module
        #deffunc mesW var p1, local p //Unicode対応のAPIを使う
            p.0 = ginfo_cx@, ginfo_cy@, ginfo_winx@, ginfo_winy@
            DrawTextW@ hdc,varptr(p1),-1,varptr(p),0
        return
    #global
 
 
    ;――――――――――――――――――――――――――――――――――――――――
    ;		ユニコード文をmに作成
    ;――――――――――――――――――――――――――――――――――――――――
    #define SIZE 70
    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
 
 
    ;――――――――――――――――――――――――――――――――――――――――
    ;		本編
    ;――――――――――――――――――――――――――――――――――――――――
    font msmincho, 16
    mesW m
    redraw 1
    stop

 上記スクリプトではUnicodeで定義された文字が使える事を示す為、敢えてメモリに数値を与えて文字列を作るような真似をしたが、cnvstow命令でShiftJISデータから変換したデータや、bload命令で読み込んだUnicodeデータに対しても利用可能である。

注意点

[1] 再描画(=redraw命令)は必須

 HSP本来の画面制御命令とは違い、命令と同時に画面が更新されない。

 故に、mesW命令を行った後は、最終的にredraw 1が書き加えられてなければいけない。


[2] strlen関数は使い物にならない

 strlen関数はShiftJISの終末コード(=[00])を探し当てて、そのオフセット値から文字列の長さを求めていると思われる。

 が、Unicodeは2Byte以上のデータで1文字を為す為、文字によってはShiftJISの終末コードを含有している可能性がある。

 例えばShiftJIS仕様の【A\nB】と言う文字列ならば、メモリ上では

<[41]> <[0D] [0A]> <[42]> <[00]>

 と書かれており、[00]が5番目に存在するので、strlen関数は【A\nB】の長さは4Byte相当だと正確に判断できる。

 ところが、Unicode仕様の【A\nB】と言う文字列は、メモリ上では

<[41] [00]> <[0D] [0A]> <[42] [00]> <[00] [00]>

 と書かれている。この場合だと、[00]が既に2番目に存在するので、strlen関数は【A\nB】の長さは1Byte相当である、などと言う勘違いをしてしまう。

 Unicode文字列のByte長を調べたいのであれば、bload命令やnoteload命令の直後にシステム変数strsizeを取得しておく必要がある。


URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2010-07-27 (火) 03:49:19 (1230d)