Project1
标题: 这是逼着姐造一遍轮子的节奏么 [打印本页]
作者: SailCat 时间: 2017-11-21 14:32
标题: 这是逼着姐造一遍轮子的节奏么
[阿尔西斯]
profile=剑士一枚
age=28
gender=女
height=175
weight=60
is_dual_wield=false
is_hero=true
[帕吉尔]
profile=脑后有反骨的仔排
age=45
gender=男
height=192
weight=80
is_dual_wield=true
is_hero=false
[阿尔西斯]
profile=剑士一枚
age=28
gender=女
height=175
weight=60
is_dual_wield=false
is_hero=true
[帕吉尔]
profile=脑后有反骨的仔排
age=45
gender=男
height=192
weight=80
is_dual_wield=true
is_hero=false
Reader = Win32API.new("kernel32", "GetPrivateProfileString", "ppppip", "i")
value = "\0" * 65534
Reader.call("阿尔西斯", "gender", "nil", value, 65534, NOTE_FILE_NAME)
p value.strip!
Reader = Win32API.new("kernel32", "GetPrivateProfileString", "ppppip", "i")
value = "\0" * 65534
Reader.call("阿尔西斯", "gender", "nil", value, 65534, NOTE_FILE_NAME)
p value.strip!
Reader = Win32API.new("kernel32", "GetPrivateProfileStringW", "ppppip", "i")
value = "\0" * 65534
Reader.call("阿尔西斯", "gender", "nil", value, 65534, [font="]NOTE_FILE_NAME[/font])
p value.strip!
Reader = Win32API.new("kernel32", "GetPrivateProfileStringW", "ppppip", "i")
value = "\0" * 65534
Reader.call("阿尔西斯", "gender", "nil", value, 65534, [font="]NOTE_FILE_NAME[/font])
p value.strip!
俩都试了,各种打出nil,nil,nil,nil,nil,nil,nil.......
作者: ⑨姐姐 时间: 2017-11-21 14:36
试试GetPrivateProfileStringW?
作者: soulsaga 时间: 2017-11-21 14:40
UTF8????????????
作者: 89444640 时间: 2017-11-21 15:09
听不太懂,感觉是对中文不友好,
少年……不对……中年大气有~
励志开发纯中文编程电脑系统吧XD
作者: chd114 时间: 2017-11-21 15:45
···用英文啊···
感觉这有点自讨苦吃
作者: soulsaga 时间: 2017-11-21 15:57
本帖最后由 soulsaga 于 2017-11-21 16:25 编辑
那GAME.INI是怎么读取的?
http://ytomy.sakura.ne.jp/tkool/ ... =interface_win32api
这脚本有何用?看不懂...
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/ ◆ Win32API用インターフェース - KGC_InterfaceForWin32API ◆ XP/VX ◆
#_/ ◇ Last update : 2007/11/26 ◇
#_/----------------------------------------------------------------------------
#_/ 汎用的な Win32API 用のインターフェースです。
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
class Win32API
WINDOW_CLASS = (defined?(::Cache) ? "RGSS2 Player" : "RGSS Player")
STRING_BUF_SIZE = 255
#--------------------------------------------------------------------------
# ○ INIファイルを読み込む
# section : セクション名
# key : キー
# default : キーが存在しない場合のデフォルト値
# inifile : 読み込むINIファイルのパス
#--------------------------------------------------------------------------
def self.GetPrivateProfileString(section, key, default, inifile)
get_ini = Win32API.new(
'kernel32.dll', 'GetPrivateProfileStringA', %w(p p p p l p), 'l')
buf = "\0" * (STRING_BUF_SIZE + 1)
get_ini.call(section, key, default, buf, STRING_BUF_SIZE, inifile)
return buf.delete!("\0")
end
#--------------------------------------------------------------------------
# ○ ウィンドウハンドルを取得
# window_class : ウィンドウクラス名
# window_title : ウィンドウのタイトル
#--------------------------------------------------------------------------
def self.FindWindow(window_class, window_title)
find_window = Win32API.new('user32.dll', 'FindWindowA', %w(p p), 'l')
return find_window.call(window_class, window_title)
end
#--------------------------------------------------------------------------
# ○ アクティブウィンドウハンドルを取得
#--------------------------------------------------------------------------
def self.GetActiveWindow
active_window = Win32API.new('user32.dll', 'GetActiveWindow', %w(v), 'l')
return active_window.call
end
#--------------------------------------------------------------------------
# ○ ゲーム画面のウィンドウハンドルを取得する
#--------------------------------------------------------------------------
def self.GetHwnd
name = GetPrivateProfileString("Game", "Title", "", "./Game.ini")
return FindWindow(WINDOW_CLASS, name)
end
end
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/ ◆ Win32API用インターフェース - KGC_InterfaceForWin32API ◆ XP/VX ◆
#_/ ◇ Last update : 2007/11/26 ◇
#_/----------------------------------------------------------------------------
#_/ 汎用的な Win32API 用のインターフェースです。
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
class Win32API
WINDOW_CLASS = (defined?(::Cache) ? "RGSS2 Player" : "RGSS Player")
STRING_BUF_SIZE = 255
#--------------------------------------------------------------------------
# ○ INIファイルを読み込む
# section : セクション名
# key : キー
# default : キーが存在しない場合のデフォルト値
# inifile : 読み込むINIファイルのパス
#--------------------------------------------------------------------------
def self.GetPrivateProfileString(section, key, default, inifile)
get_ini = Win32API.new(
'kernel32.dll', 'GetPrivateProfileStringA', %w(p p p p l p), 'l')
buf = "\0" * (STRING_BUF_SIZE + 1)
get_ini.call(section, key, default, buf, STRING_BUF_SIZE, inifile)
return buf.delete!("\0")
end
#--------------------------------------------------------------------------
# ○ ウィンドウハンドルを取得
# window_class : ウィンドウクラス名
# window_title : ウィンドウのタイトル
#--------------------------------------------------------------------------
def self.FindWindow(window_class, window_title)
find_window = Win32API.new('user32.dll', 'FindWindowA', %w(p p), 'l')
return find_window.call(window_class, window_title)
end
#--------------------------------------------------------------------------
# ○ アクティブウィンドウハンドルを取得
#--------------------------------------------------------------------------
def self.GetActiveWindow
active_window = Win32API.new('user32.dll', 'GetActiveWindow', %w(v), 'l')
return active_window.call
end
#--------------------------------------------------------------------------
# ○ ゲーム画面のウィンドウハンドルを取得する
#--------------------------------------------------------------------------
def self.GetHwnd
name = GetPrivateProfileString("Game", "Title", "", "./Game.ini")
return FindWindow(WINDOW_CLASS, name)
end
end
作者: SixRC 时间: 2017-11-21 16:43
本帖最后由 SixRC 于 2017-11-21 16:46 编辑
试了一下 终于成功了
GetPrivateProfileStringA 或者 W
A的话 阿尔西斯需要转码成 ANSI ini 路径也是
就能成功获取gender 不过得到的是 ANSI 需要自己转回去
W的话 就都得用 Unicode UTF-8不行
不清楚内部的机制 查找 阿尔西斯 这串字符的时候 大概有什么出入
必须得全用 ANSI 或者 Unicode 吧
成功的代码
WideCharToMultiByte=Win32API.new('kernel32','WideCharToMultiByte','llplplll','l')
MultiByteToWideChar=Win32API.new('kernel32','MultiByteToWideChar','llplpl','l')
def utf8_to_uni(str)
len=MultiByteToWideChar.call(0xFDE9,0,str,-1,0,0)
str2="\0"*len
MultiByteToWideChar.call(0xFDE9,0,str,-1,str2,len)
str2
end
Reader = Win32API.new("kernel32", "GetPrivateProfileStringW", "ppppip", "i")
value = "\0" * 65534
aa="阿尔西斯"
aa=utf8_to_uni("阿尔西斯")
k= "gender"
k=utf8_to_uni(k)
ini=Dir.pwd+"/a.ini"
ini=utf8_to_uni(ini)
Reader.call(aa, k, "nil", value, 65534, ini)
p value.strip!
WideCharToMultiByte=Win32API.new('kernel32','WideCharToMultiByte','llplplll','l')
MultiByteToWideChar=Win32API.new('kernel32','MultiByteToWideChar','llplpl','l')
def utf8_to_uni(str)
len=MultiByteToWideChar.call(0xFDE9,0,str,-1,0,0)
str2="\0"*len
MultiByteToWideChar.call(0xFDE9,0,str,-1,str2,len)
str2
end
Reader = Win32API.new("kernel32", "GetPrivateProfileStringW", "ppppip", "i")
value = "\0" * 65534
aa="阿尔西斯"
aa=utf8_to_uni("阿尔西斯")
k= "gender"
k=utf8_to_uni(k)
ini=Dir.pwd+"/a.ini"
ini=utf8_to_uni(ini)
Reader.call(aa, k, "nil", value, 65534, ini)
p value.strip!
记得把 ini 保存成 Unicode
哪个方便用哪个吧
作者: SailCat 时间: 2017-11-21 19:38
然而我已经造了轮子……
一会评估一下大量的检索哪个比较快吧
def self.read_ini(section, parameter, default, filename)
begin
File.open(filename) do |f|
ks = "[#{section}]\n"
kp = parameter + "="
flag = false
f.each_line do |l|
next unless l == ks or flag
flag = (l == ks or l[0] != "[")
next unless l[0...kp.length] == kp
return (eval(l[kp.length..-2]) rescue l[kp.length..-2])
end
end
rescue
end
return default
end
def self.read_ini(section, parameter, default, filename)
begin
File.open(filename) do |f|
ks = "[#{section}]\n"
kp = parameter + "="
flag = false
f.each_line do |l|
next unless l == ks or flag
flag = (l == ks or l[0] != "[")
next unless l[0...kp.length] == kp
return (eval(l[kp.length..-2]) rescue l[kp.length..-2])
end
end
rescue
end
return default
end
作者: SixRC 时间: 2017-11-21 21:03
内存错误的原因在 utf8_to_uni 的第 5 行
原因是那个 len 返回值是宽字符的字数 申请空间不能是一去乘..我的疏忽
再乘个四就不会出错了
说到方法 当然是哪个方便易维护用哪个啦
读取 ini 一点效率大概是不用计较的了 大量数据不如自定义格式
用着舒服为准吧
作者: shitake 时间: 2017-11-22 00:21
所以为啥不用json/xml呢
滑稽.jpg
作者: SailCat 时间: 2017-11-22 02:17
轮子造完碎觉
https://rpg.blue/thread-403415-1-1.html
作者: 赤炎 时间: 2017-11-22 02:50
炸出很多懂技术的人
作者: SixRC 时间: 2017-11-22 12:11
本帖最后由 SixRC 于 2017-11-22 12:12 编辑
我也突发奇想写了一个
极致效率的话
不如预读取加哈希?
class Rini
def initialize(ini)
@hash,temp=Hash.new,nil
open(ini,'r').read{|i|i.delete!(" ")}.each_line do |i|
next if j=i.match(/\[.*\]/) and [j=j[0],j=j[1..-2],temp=@hash[j]=Hash.new]
t=i.split("=")
temp[t[0]]=t[1].chomp
end
end
def read(section,key,default="nil")
@hash[section] ? @hash[section][key] || default : default
end
end
ba=Rini.new('a.ini')
p ba.read('阿尔西斯','gender'),ba.read('帕吉尔','profile')
class Rini
def initialize(ini)
@hash,temp=Hash.new,nil
open(ini,'r').read{|i|i.delete!(" ")}.each_line do |i|
next if j=i.match(/\[.*\]/) and [j=j[0],j=j[1..-2],temp=@hash[j]=Hash.new]
t=i.split("=")
temp[t[0]]=t[1].chomp
end
end
def read(section,key,default="nil")
@hash[section] ? @hash[section][key] || default : default
end
end
ba=Rini.new('a.ini')
p ba.read('阿尔西斯','gender'),ba.read('帕吉尔','profile')
速度大概是
10000 次 0.005 s
作者: 不死鸟之翼 时间: 2017-12-6 22:40
本帖最后由 不死鸟之翼 于 2017-12-6 22:42 编辑
突然冒出来说几句)
GetPrivateProfile系列API是16位Windows时代的产物,现在还保留这个API只是出于兼容目的,不是让你读写配置文件的,巨硬声称随时可能移除。
最要命的是它有若干问题,比如编码问题 长度问题 路径问题
你可以自己实现一下配置文件读写。最简单的键值对连状态机都不用写
另外W后缀的API接受的是宽字符串,具体说来就是UCS-2编码(约等于UTF-16LE)
以及微软喜欢管UTF-16LE叫做Unicode,管UTF-8叫UTF-8,管多字节编码(可能是GBK、Shift-JIS、ASCII……)叫ANSI
所以Unicode和UTF-8并不是一个层面的东西)
作者: summer92 时间: 2017-12-7 08:54
rgss可以写入中文,就是读取不了中文,可以理解为语言对中文的不友好
作者: 精灵使者 时间: 2017-12-9 22:46
突然想起某个中文用户名问题。
顺便安利一下。
http://rpg.blue/forum.php?mod=viewthread&tid=372526
这我遇到了同样的问题
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |