设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 4070|回复: 27
打印 上一主题 下一主题

[有事请教] 这是逼着姐造一遍轮子的节奏么

[复制链接]

Lv5.捕梦者 (版主)

遠航の猫咪

梦石
3
星屑
23186
在线时间
2387 小时
注册时间
2005-10-15
帖子
1166

开拓者

跳转到指定楼层
1
发表于 2017-11-21 14:32:08 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
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:32
SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。

Lv3.寻梦者 (暗夜天使)

精灵族の天使

梦石
0
星屑
1697
在线时间
3038 小时
注册时间
2007-3-16
帖子
33731

开拓者贵宾

16
发表于 2017-12-9 22:46:05 | 只看该作者
突然想起某个中文用户名问题。
顺便安利一下。
http://rpg.blue/forum.php?mod=viewthread&tid=372526
这我遇到了同样的问题
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1337
在线时间
675 小时
注册时间
2009-11-11
帖子
2790
15
发表于 2017-12-7 08:54:01 | 只看该作者
rgss可以写入中文,就是读取不了中文,可以理解为语言对中文的不友好

嘿。嘿。嘿
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1803
在线时间
133 小时
注册时间
2013-10-6
帖子
193
14
发表于 2017-12-6 22:40:10 | 只看该作者
本帖最后由 不死鸟之翼 于 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并不是一个层面的东西)
←你看到一只经常潜水的萌新。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
13562
在线时间
2753 小时
注册时间
2014-10-4
帖子
756

R考场第七期纪念奖

13
发表于 2017-11-22 12:11:10 | 只看该作者
本帖最后由 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

点评

嗯 自己手写个ini读取也比折腾win32API快 感觉  发表于 2017-11-22 14:54
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2308
在线时间
1602 小时
注册时间
2014-9-28
帖子
2792

开拓者

12
发表于 2017-11-22 02:50:34 | 只看该作者
炸出很多懂技术的人
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

遠航の猫咪

梦石
3
星屑
23186
在线时间
2387 小时
注册时间
2005-10-15
帖子
1166

开拓者

11
 楼主| 发表于 2017-11-22 02:17:14 | 只看该作者
SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4598
在线时间
1206 小时
注册时间
2016-4-7
帖子
982

开拓者

10
发表于 2017-11-22 00:21:32 | 只看该作者
所以为啥不用json/xml呢
滑稽.jpg

点评

标准库里自然有 不过rm里就不要想了 全被阉割掉了 不过这种都有人写过现成的脚本  发表于 2017-11-22 14:49
ruby有内建的json/xml reader? ini的轮子够方便了……  发表于 2017-11-22 00:43
附庸的附庸不是我的附庸,女儿的女儿还是我的女儿。CK2沉迷ing
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
13562
在线时间
2753 小时
注册时间
2014-10-4
帖子
756

R考场第七期纪念奖

9
发表于 2017-11-21 21:03:57 | 只看该作者
内存错误的原因在 utf8_to_uni 的第 5 行
原因是那个 len 返回值是宽字符的字数 申请空间不能是一去乘..我的疏忽
再乘个四就不会出错了

说到方法 当然是哪个方便易维护用哪个啦
读取 ini 一点效率大概是不用计较的了 大量数据不如自定义格式
用着舒服为准吧
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

遠航の猫咪

梦石
3
星屑
23186
在线时间
2387 小时
注册时间
2005-10-15
帖子
1166

开拓者

8
 楼主| 发表于 2017-11-21 19:38:20 | 只看该作者
然而我已经造了轮子……
一会评估一下大量的检索哪个比较快吧
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


SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-13 01:24

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表