Windows 2000以降
Windows 2000以降
#include "user32.as"
#module
#uselib "msvcrt"
#cfunc strstr "strstr" int, sptr
#uselib "kernel32"
#func MultiByteToWideChar "MultiByteToWideChar" int, int, sptr, int, sptr, int
#func WideCharToMultiByte "WideCharToMultiByte" int, int, sptr, int, sptr, int, int, int
#deffunc UTF8ToUnicode var in, var out
MultiByteToWideChar 65001/*CP_UTF8*/, 0, varptr(in), -1, 0, 0
len = stat
sdim out, len * 2 + 2
MultiByteToWideChar 65001/*CP_UTF8*/, 0, varptr(in), -1, varptr(out), len
return len
#deffunc UnicodeToUTF8 var in, var out
// Unicode → UTF-8
WideCharToMultiByte 65001/*CP_UTF8*/, 0, varptr(in), -1, 0, 0, 0, 0
len = stat
sdim out, len + 1
WideCharToMultiByte 65001/*CP_UTF8*/, 0, varptr(in), -1, varptr(out), len, 0, 0
return len
#deffunc ShiftJISToUTF8 str _in_sjis, var out_utf8
in_sjis = _in_sjis
// SHIFT_JIS → Unicode
len = strlen(_in_sjis) * 2
sdim uni, len + 2
cnvstow uni, _in_sjis
// Unicode → UTF-8
WideCharToMultiByte 65001/*CP_UTF8*/, 0, varptr(uni), -1, 0, 0, 0, 0
len = stat
sdim out_utf8, len + 1
WideCharToMultiByte 65001/*CP_UTF8*/, 0, varptr(uni), -1, varptr(out_utf8), len, 0, 0
return len
#deffunc BOMDelete var in_utf8
// EF BB BF(BOM) 手抜き~
if (0xBFBBEF == (lpeek(in_utf8, 0) & 0xFFFFFF)){
len = strlen(in_utf8)
sdim copybuf, len*2 + 1
copybuf = in_utf8
sdim in_utf8, len*2 + 1
memcpy in_utf8, copybuf, len, 0, 3
return 1
}
return 0
// instr(UTF8対応版)
#defcfunc instr_utf8 var in_buf, int p, str _key
key = _key
inbuf_ptr = varptr(in_buf) + p
s_pos = strstr(inbuf_ptr, key)
if s_pos == 0 : return -1
return (s_pos - inbuf_ptr)
#global
tt = "日蒙簡易辞書 Ver 1.00(Unicode対応版)"
*main
exist "jmdic.txt"
if strsize == -1 : dialog "jmdic.txt が見つかりません" : end
// ファイルロード
notesel buf
noteload "jmdic.txt"
// BOMを検出した場合は削除
BOMDelete buf
gosub *DrawGUI
stop
*DrawGUI
title tt
sdim dummy
font "メイリオ", 18, 16
objmode 2, 1
pos 0, 0
input dummy, 500, 34 : objid_input = stat : hobj_input = objinfo(objid_input, 2)
pos 500, 0 : objsize 140, 34
button gosub "検索", *btn_search
pos 0, 34
mesbox dummy, 640, 480 - 34, 0, 0 : objid_msg = stat : hobj_msg = objinfo(objid_msg, 2)
onkey gosub *key
return
*key
objsel -1
if wparam == 13 && stat == objid_input : gosub *btn_search
return
*btn_search
sdim uni_keyword, 1024*2 + 2
GetWindowTextW hobj_input, varptr(uni_keyword), 1024
UnicodeToUTF8 uni_keyword, keyword
sdim out, 1024*100 : num = 0
SetWindowTextW hobj_msg, varptr(out)
notesel buf
repeat notemax
noteget tmp, cnt
if keyword == "" || instr_utf8(tmp, 0, keyword) != -1{
out += tmp + "\n"
num++
}
loop
if num == 0{
ShiftJISToUTF8 "検索ヒント:\n別の言い回しで検索すると出る場合があります。\n漢字をひらがなにしたり単漢字で検索しても出る可能性があります。", out
}
UTF8ToUnicode out, out2
SetWindowTextW hobj_msg, varptr(out2)
title tt+" "+num+"件見つけました!"
return