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


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0409
名無しhsp3utf 文字列操作6解決


名無し

リンク

2017/4/9(Sun) 10:45:23|NO.79036

hsp3utfランタイムのstrlen、strmidなどは通常のランタイムと変わらないようで、文字列の長さ
や切り出しなどが文字単位でできないようです。スクリプト内の文字列をunicodeで統一したいので、
utf8,16文字列の操作用プラグインなどを紹介して頂けないでしょうか。



この記事に返信する


tds12

リンク

2017/4/9(Sun) 11:59:34|NO.79037

VBScriptのオブジェクトを作って、
Midを呼び出すのはどうでしょうか?



名無し

リンク

2017/4/9(Sun) 20:37:08|NO.79053

tds12さん、Unicode対応ランタイムの開発、非常にありがたいです。
>VBScriptのオブジェクトを作って、
>Midを呼び出すのはどうでしょうか?
それはScriptControlを使うということでしょうか。



tds12

リンク

2017/4/9(Sun) 21:59:59|NO.79054

はい。
下手ですがだいたいこのようかと思います。

#include "hsp3utf.as" newcom VB, "ScriptControl" VB("Language")="VBScript" sdim res comres res VB->"AddCode" "Function strmid(p1,p2,p3)\nstrmid=Mid(p1,p2,p3)\nEnd Function" VB->"Run" "strmid","あいうえお",2,2 mes res delcom VB

念のため自由に使ってよいと明示します。
あと念のため自己責任でお願いします。



名無し

リンク

2017/4/10(Mon) 07:53:55|NO.79058

ありがとうございます。これならなんとかなりそうです。
Unicode版ランタイムの開発、これからもお願いします。



名無し

リンク

2017/4/10(Mon) 09:59:06|NO.79060

WinAPI使うのもいいかもしれませんね。

#include "hsp3utf.as" #define global WSTR_USEMACLANG //機械語を使うかどうか ; wstr.as #ifndef WSTR_AS #define WSTR_AS #ifdef WSTR_USEMACLANG ; xalloc.as #ifndef XALLOC_AS #define XALLOC_AS #module #uselib "kernel32.dll" #func VirtualProtect "VirtualProtect" var, int, int, var #define global PAGE_EXECUTE_READWRITE 0x00000040 #deffunc xalloc var mem, int size dim mem, size / 4 + 1 temp = 0 VirtualProtect mem, size, PAGE_EXECUTE_READWRITE, temp return #global #endif #endif #module #uselib "kernel32.dll" #cfunc lstrlen "lstrlenW" wstr #func lstrcpyn "lstrcpynW" int, int, int #uselib "user32.dll" #cfunc CharNext "CharNextW" int #ifdef WSTR_USEMACLANG #deffunc wstr_init xalloc wstrmid_f_, 48 wstrmid_f_(0) = $0824448b,$24748b56,$7ef68510,$11bf570f wstrmid_f_(4) = $50111111,$ee83d7ff,$5ff87501,$14244c8b wstrmid_f_(8) = $ff505141,$b8102474,$22222222,$c35ed0ff lpoke wstrmid_f_, 15, varptr(CharNext) lpoke wstrmid_f_, 40, varptr(lstrcpyn) return #endif #defcfunc wstrmid str _src, int _index, int _len size = strlen(_src) * 2 sdim src, size sdim dest, size cnvstow src, _src #ifdef WSTR_USEMACLANG prm = varptr(dest), varptr(src), _index, _len res = callfunc(prm, varptr(wstrmid_f_), 4) #else p = varptr(src) repeat _index p = CharNext(p) loop lstrcpyn varptr(dest), p, _len + 1 #endif dest = cnvwtos(dest) return dest #defcfunc wstrlen str _s return lstrlen(_s) #global #ifdef WSTR_USEMACLANG wstr_init #endif #endif buf = "指定した TCHAR の数の文字を格納" mes wstrlen(buf) ; => 19 mes wstrmid(buf, 5, 8) ; => "TCHARの数" ; wstrmid.c /* void wstrmid(int dest, int src, int index, int len) { typedef int (__stdcall *next_t)(int); typedef int (__stdcall *copyn_t)(int, int, int); next_t next = (next_t)0x11111111; copyn_t copyn = (copyn_t)0x22222222; int p = src; for (int i = 0; i < index; i++) p = next(p); copyn(dest, p, len + 1); } */



名無し

リンク

2017/4/11(Tue) 19:14:46|NO.79081

どうでもいいけど#include "hsp3utf.as"外せば普通のランタイムでも動きますね。



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