hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。 |
小ワザ/Win32API関連/Unicodeのデータをmes命令のように表示する
Unicodeのデータ自体を操作するだけならHSP3でも十分可能なのだが、mes命令のようにUnicode文字を表示するにはWin32APIの力が現状(=ver3.2時点)では必要である。
HSP3掲示板No,419kou様提示のスクリプトの丸写し by 木村
1 2 3 4 5 6 7 |
|
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 |
|
上記スクリプトでは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を取得しておく必要がある。