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

Project1

 找回密码
 注册会员
搜索
楼主: 星之璇
打印 上一主题 下一主题

[已经解决] 问个关于ruby的问题

[复制链接]

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
1
发表于 2010-8-2 03:38:38 | 显示全部楼层
RGSS 默认是 UTF-8,你可以通过修改 $-K 或者 $KCODE 的值改变编码,以下几种是 Ruby 支持的编码:
# - None (n or N)
# - EUC (e or E)
# - Shift_JIS (s or S)
# - UTF-8 (u or U)
那么 $KCODE = "S" 就告诉解释器现在开始使用 Shift_JIS 字符集了。注意这个修改不但改变了字符串和正则表达式的解码,同时也会改变整个脚本的解码方式,即解释器解码并解析脚本源文件的方法

至于其它字符集,和平台有关,在 Windows 上可以使用 Windows API 控制 Windows 的代码页,主要也就是用 MultiByteToWideChars 和 WideCharsToMultiByte 这俩函数
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
2
发表于 2010-8-5 11:36:23 | 显示全部楼层
open 打开一个文件输入流,获取文件全部内容,关闭,然后根据文件的编码把字符串转码为 UTF-8 即可。你可以搜索一下“转码”,有前人写的现成代码可以复制粘贴
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
3
发表于 2010-8-8 10:06:55 | 显示全部楼层
回复 星之璇 的帖子

IO#read,不传递参数则读取数据到 EOF 为止
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
4
发表于 2010-8-8 10:48:27 | 显示全部楼层
回复 星之璇 的帖子

Ruby 没有主见,决定文本是什么编码的是脚本编写者你。通常情况下程序进行正常的文本文件 I/O 操作,其编码都不会是动态的,所以在程序中可以静态决定编码

如果你能确定某个文本文件的编码,那么你脚本的输入过程应该是:
1、open 打开输入流
2、str = "" 初始化字符串缓冲区
3、read 将流中的字节全部读取到 str 中
4、如果文本文件编码本来就是 UTF-8,那就不用改了,可以直接使用;如果不是,通过 MultiByteToWideChar 将字符串转码为 UTF-16,然后再用 WideCharToMultiByte 把 UTF-16 的字符串转换为 UTF-8

关于自动检测编码:
如果编码是 Unicode(UTF-8、UTF-16、UTF-32 或者其它一些比较罕见的 Unicode 家族成员),那么可以在文件开头写入标识了文件属于那一种 Unicode 表示的字节序记号(BOM),这样就能在运行时决定文本文件编码,具体的码点可以参考:
http://zh.wikipedia.org/zh-cn/%E ... F%E8%A8%98%E8%99%9F
如果文件编码不一定是 Unicode,或者文件开头不一定包含 BOM,那你可以写一个专门在运行时自动检测文本文件编码格式的脚本,读取足够的数据,统计出各种编码的特征,然后根据统计结果给出最有可能的编码。这是一个非确定性的过程,而且必然会造成一定的效率损失
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
5
发表于 2010-8-8 16:00:21 | 显示全部楼层
回复 星之璇 的帖子

这个是 Ruby 1.9 才有的功能,RM 用的是 Ruby 1.8,并不支持这种文件打开的模式
   
那就比如,某文本文件是utf-16的编码,我该如何读取呢? ruby下输入了个File.public_methods……瞬间晕了,没找到

如果本来就是 UTF-16,那就不需要 MultiByteToWideChar 了(已经是宽字符 Wide character),获取数据后直接 WideCharToMultiByte 转到 UTF-8:

str = ''
open("filename") { |fin|
    str = fin.read
}
WideCharToMultiByte.call(...)   # 把 str 从 UTF-16 转码到 UTF-8

在 Ruby 里类本身也是对象,是 Class 类型的对象,而 public_methods 是返回接收者对象的公有实例方法,你这里指定的接收者是 File,File 是一个 Class 对象,所以这里返回给你的是该 Class 对象,包括其基类的实例方法

我之前说的 IO#read 是 IO 类实例的实例方法,“类#方法”表示类的实例方法,而不是类本身这个 Class 对象的实例方法(也就是其它语言中的静态方法)
File 是 IO 的子类,所以也继承了 IO#read方法
你想要的是 File 类的实例方法,可以通过 instance_methods 来返回某个类的实例方法(或者已经有了一个 File 的实例对象,就可以让这个对象作为接受者调用 public_methods):File.instance_methods
当然凭人眼想要在这么一堆没有换行的方法名里浏览不是什么轻松的事,这里为了演示 read 确实是 File 的实例方法,可以尝试运行 p File.instance_methods.include?("read")
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
6
发表于 2010-8-9 01:31:15 | 显示全部楼层
回复 星之璇 的帖子

看脚本最后的 String#to_unicode 和 String#to_UTF8 方法
http://rpg.blue/forum.php?mod=vi ... 23477&from=home
   

评分

参与人数 1星屑 +1500 收起 理由
DeathKing + 1500 = =本贴涉及内容过多

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-6 16:39

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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