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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0524
まーるcnvstowについて2解決


まーる

リンク

2014/5/24(Sat) 13:36:58|NO.62155

Windows8.1(64bit)で、HSP3.4b4です。
文字数を取得するときにcnvstow+lstrlenWをよく使っていますが、
31までは合うのに、32文字以上の文字数になると
なぜか文字数の取得結果が33になってしまうようで困っています。



#uselib "kernel32.dll" #cfunc lstrlenW "lstrlenW" var sjis31 = "1234567890123456789012345678901" sjis32 = "12345678901234567890123456789012" sjis33 = "123456789012345678901234567890123" sjis34 = "1234567890123456789012345678901234" CountUnicodeText sjis31 CountUnicodeText sjis32 CountUnicodeText sjis33 CountUnicodeText sjis34 stop #deffunc CountUnicodeText str p1 unicode = "" sjis = p1 cnvstow unicode, sjis mes lstrlenW(unicode) return



一方、cnvstowではなくMultiByteToWideCharでやってみた結果です。
こちらでは正しい文字数が返ってきているようです、cnvwtosについては未確認です。
他の環境でも再現されるようなら対応をお願いします。


#uselib "kernel32.dll" #cfunc lstrlenW "lstrlenW" var #cfunc MultiByteToWideChar "MultiByteToWideChar" int, int, sptr, int, sptr, int sjis31 = "1234567890123456789012345678901" sjis32 = "12345678901234567890123456789012" sjis33 = "123456789012345678901234567890123" sjis34 = "1234567890123456789012345678901234" CountUnicodeText sjis31 CountUnicodeText sjis32 CountUnicodeText sjis33 CountUnicodeText sjis34 stop #deffunc CountUnicodeText str p1 ;; cnvstow unicode, sjis sjis = p1 unilen = MultiByteToWidechar(0, 0, varptr(sjis), -1, 0, 0) sdim unicode, unilen * 2 unilen = MultiByteToWideChar(0, 0, varptr(sjis), -1, varptr(unicode), unilen) mes lstrlenW(unicode) return



この記事に返信する


fortunehill

リンク

2014/5/24(Sat) 13:54:25|NO.62156

/*ご参考*(無宣言で使用する文字列型配列のサイズは64バイトが原因でわ?)/

#deffunc CountUnicodeText str p1 sjis = p1 sdim unicode,strlen(sjis)*3 cnvstow unicode, sjis mes lstrlenW(unicode) return



まーる

リンク

2014/5/25(Sun) 15:12:07|NO.62174

回答ありがとうございます。
文字列変数が自動拡張されるのではという思い込みがありました。
sdim unicode, strlen(sjis)*2 + 2
ぶん確保しておけば正しい値が得られました、助かりました。



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