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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0224
( ´・ω・`)cnvstowについて3解決


( ´・ω・`)

リンク

2018/2/24(Sat) 12:01:43|NO.82550

入力された文字列を一字ずつ取り出して表示(ルパン三世のタイトルみたいなこと)をしようと、以下のようなプログラムを立てました。


sdim text sdim textuni, 100 sdim temp dim textstart dim x dim y x=ginfo(20) y=ginfo(21) *main bgscr screen 0,1000,100,0,0,0,1000,100 textstart=0 mes "下のテキストボックスに表示したい文字を入力(全角50字まで)" font "", 20:objmode 2:objsize 1000 , 25:input text, 1000, 50 font "", 5:mes "" font "", 20 button "Go" , *disp stop *disp cnvstow textuni , text bgscr 0, x, y repeat await 500 cls temp=strmid(textuni, textstart, 2) dis=cnvwtos( temp ) if dis="" : break mes dis textstart=textstart+2 loop goto *main
他人に見せる予定はなかったのでとても見づらいと思います、、、。
問題は

cnvstow textuni , text
の部分です。
空白がない全角文字列だと
あああ → 0B0B0B
と正しく変換してくれるのですが、
空白があると
あああ あああ → 0B0B0B
、半角文字列だと
test → t
というように正しく変換してくれません。特に
test → t
はとても大きいです。
対処法がわかる方、お願いします。



この記事に返信する


さか

リンク

2018/2/24(Sat) 14:02:12|NO.82553

peekで1バイトづつ読んで半角全角を判断ですかねえ。
https://wiki.hsp.moe/String%EF%BC%8F改行.html#o681c775



あまら

リンク

2018/2/24(Sat) 14:52:44|NO.82554

デバックウィンドウでメモリダンプをみるとわかりますが、
半角文字の例として「abc」の場合、
通常は「61 62 63」となっていますが
UTF16になると「61 00 62 00 63 00」と間に「00」(文字列の終端コード)が入り、
strmidでは「00」の後は全て切り捨てらるため、2文字目以降が無い物として処理されます。
全角スペースも同様に「00」が入っています。


解決法としてはstrmidでは無くmemcpyを使えば可能です
//temp=strmid(textuni, textstart, 2)
memcpy temp, textuni, 2, 0, textstart // memcpyはメモリ内容をそのままコピーするので問題ない。


あと細かいツッコミですが
> cnvstow textuni , text
この行、全角スペースになっています。
これはそのままでもエラーにはならないんですが、ちょっと気になってしまったので。



( ´・ω・`)

リンク

2018/2/25(Sun) 10:09:56|NO.82557


memcpy temp, textuni, 2, 0, textstart
でできました!ありがとうございました。

なお、全角スペースとのご指摘がありましたが、スクリプトを確認してみたら半角でした。なぜだろう、、、



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