文字数を取得するときに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