Project1

标题: 这是逼着姐造一遍轮子的节奏么 [打印本页]

作者: SailCat    时间: 2017-11-21 14:32
标题: 这是逼着姐造一遍轮子的节奏么
INI 代码复制
  1. [阿尔西斯]
  2. profile=剑士一枚
  3. age=28
  4. gender=
  5. height=175
  6. weight=60
  7. is_dual_wield=false
  8. is_hero=true
  9. [帕吉尔]
  10. profile=脑后有反骨的仔排
  11. age=45
  12. gender=
  13. height=192
  14. weight=80
  15. is_dual_wield=true
  16. is_hero=false

RUBY 代码复制
  1. Reader = Win32API.new("kernel32", "GetPrivateProfileString", "ppppip", "i")
  2.   value = "\0" * 65534
  3.   Reader.call("阿尔西斯", "gender", "nil", value, 65534, NOTE_FILE_NAME)
  4.   p value.strip!


RUBY 代码复制
  1. Reader = Win32API.new("kernel32", "GetPrivateProfileStringW", "ppppip", "i")
  2.   value = "\0" * 65534
  3.   Reader.call("阿尔西斯", "gender", "nil", value, 65534, [font=&quot]NOTE_FILE_NAME[/font])
  4.   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
这脚本有何用?看不懂...


RUBY 代码复制
  1. #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
  2. #_/    ◆ Win32API用インターフェース - KGC_InterfaceForWin32API ◆ XP/VX ◆
  3. #_/    ◇ Last update : 2007/11/26 ◇
  4. #_/----------------------------------------------------------------------------
  5. #_/  汎用的な Win32API 用のインターフェースです。
  6. #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
  7.  
  8. class Win32API
  9.   WINDOW_CLASS = (defined?(::Cache) ? "RGSS2 Player" : "RGSS Player")
  10.   STRING_BUF_SIZE = 255
  11.   #--------------------------------------------------------------------------
  12.   # ○ INIファイルを読み込む
  13.   #     section : セクション名
  14.   #     key     : キー
  15.   #     default : キーが存在しない場合のデフォルト値
  16.   #     inifile : 読み込むINIファイルのパス
  17.   #--------------------------------------------------------------------------
  18.   def self.GetPrivateProfileString(section, key, default, inifile)
  19.     get_ini = Win32API.new(
  20.       'kernel32.dll', 'GetPrivateProfileStringA', %w(p p p p l p), 'l')
  21.     buf = "\0" * (STRING_BUF_SIZE + 1)
  22.     get_ini.call(section, key, default, buf, STRING_BUF_SIZE, inifile)
  23.     return buf.delete!("\0")
  24.   end
  25.   #--------------------------------------------------------------------------
  26.   # ○ ウィンドウハンドルを取得
  27.   #     window_class : ウィンドウクラス名
  28.   #     window_title : ウィンドウのタイトル
  29.   #--------------------------------------------------------------------------
  30.   def self.FindWindow(window_class, window_title)
  31.     find_window = Win32API.new('user32.dll', 'FindWindowA', %w(p p), 'l')
  32.     return find_window.call(window_class, window_title)
  33.   end
  34.   #--------------------------------------------------------------------------
  35.   # ○ アクティブウィンドウハンドルを取得
  36.   #--------------------------------------------------------------------------
  37.   def self.GetActiveWindow
  38.     active_window = Win32API.new('user32.dll', 'GetActiveWindow', %w(v), 'l')
  39.     return active_window.call
  40.   end
  41.   #--------------------------------------------------------------------------
  42.   # ○ ゲーム画面のウィンドウハンドルを取得する
  43.   #--------------------------------------------------------------------------
  44.   def self.GetHwnd
  45.     name = GetPrivateProfileString("Game", "Title", "", "./Game.ini")
  46.     return FindWindow(WINDOW_CLASS, name)
  47.   end
  48. 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 吧
成功的代码
RUBY 代码复制
  1. WideCharToMultiByte=Win32API.new('kernel32','WideCharToMultiByte','llplplll','l')
  2. MultiByteToWideChar=Win32API.new('kernel32','MultiByteToWideChar','llplpl','l')
  3. def utf8_to_uni(str)
  4.   len=MultiByteToWideChar.call(0xFDE9,0,str,-1,0,0)
  5.   str2="\0"*len
  6.   MultiByteToWideChar.call(0xFDE9,0,str,-1,str2,len)
  7.   str2
  8. end
  9. Reader = Win32API.new("kernel32", "GetPrivateProfileStringW", "ppppip", "i")
  10. value = "\0" * 65534
  11. aa="阿尔西斯"
  12. aa=utf8_to_uni("阿尔西斯")
  13. k= "gender"
  14. k=utf8_to_uni(k)
  15. ini=Dir.pwd+"/a.ini"
  16. ini=utf8_to_uni(ini)
  17. Reader.call(aa, k, "nil", value, 65534, ini)
  18. p value.strip!


记得把 ini 保存成 Unicode
哪个方便用哪个吧
作者: SailCat    时间: 2017-11-21 19:38
然而我已经造了轮子……
一会评估一下大量的检索哪个比较快吧
RUBY 代码复制
  1. def self.read_ini(section, parameter, default, filename)
  2.     begin
  3.       File.open(filename) do |f|
  4.         ks = "[#{section}]\n"
  5.         kp = parameter + "="
  6.         flag = false
  7.         f.each_line do |l|
  8.           next unless l == ks or flag
  9.           flag = (l == ks or l[0] != "[")
  10.           next unless l[0...kp.length] == kp
  11.           return (eval(l[kp.length..-2]) rescue l[kp.length..-2])
  12.         end
  13.       end
  14.     rescue
  15.     end
  16.     return default
  17.   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 编辑

我也突发奇想写了一个
极致效率的话
不如预读取加哈希?
RUBY 代码复制
  1. class Rini
  2.   def initialize(ini)
  3.     @hash,temp=Hash.new,nil
  4.     open(ini,'r').read{|i|i.delete!(" ")}.each_line do |i|
  5.       next if j=i.match(/\[.*\]/) and [j=j[0],j=j[1..-2],temp=@hash[j]=Hash.new]
  6.       t=i.split("=")
  7.       temp[t[0]]=t[1].chomp
  8.     end
  9.   end
  10.   def read(section,key,default="nil")
  11.     @hash[section] ? @hash[section][key] || default : default
  12.   end
  13. end
  14.  
  15. ba=Rini.new('a.ini')
  16. 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