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

Project1

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

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

[复制链接]

Lv2.观梦者

神隐的主犯

梦石
0
星屑
283
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

21
发表于 2010-8-4 16:48:36 | 只看该作者
不过,很在意。

直接用 记事本 读的话,是不是和 Ruby 没关系了~~~

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

Lv3.寻梦者

小睡

梦石
0
星屑
2186
在线时间
508 小时
注册时间
2010-8-1
帖子
1378
22
 楼主| 发表于 2010-8-5 11:25:28 | 只看该作者
回复 魔女真利亞 的帖子

所以觉得这个方法很山寨……
ruby读文本这么麻烦
   
回复 支持 反对

使用道具 举报

Lv1.梦旅人

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

使用道具 举报

Lv3.寻梦者

孤独守望

梦石
0
星屑
3132
在线时间
1535 小时
注册时间
2006-10-16
帖子
4321

开拓者贵宾

24
发表于 2010-8-5 12:02:17 | 只看该作者
于是跑来乱入解答第一个问题:dump 1然后dump 2,load先出1再出2,可以理解成FIFO
Marshal格式请点击这里
菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客
回复 支持 反对

使用道具 举报

Lv3.寻梦者

小睡

梦石
0
星屑
2186
在线时间
508 小时
注册时间
2010-8-1
帖子
1378
25
 楼主| 发表于 2010-8-7 17:02:57 | 只看该作者
回复 紫苏 的帖子

如何获取输入流全部内容?用哪个函数?
   
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
26
发表于 2010-8-8 10:06:55 | 只看该作者
回复 星之璇 的帖子

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

使用道具 举报

Lv3.寻梦者

小睡

梦石
0
星屑
2186
在线时间
508 小时
注册时间
2010-8-1
帖子
1378
27
 楼主| 发表于 2010-8-8 10:24:13 | 只看该作者
回复 紫苏 的帖子

谢谢~

那……还是问句老话,ruby认为该文本的编码是哪个呢?
   
欢迎来到6R RTP Maker!加入RTP行走图制作组的行列吧!
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
28
发表于 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,那你可以写一个专门在运行时自动检测文本文件编码格式的脚本,读取足够的数据,统计出各种编码的特征,然后根据统计结果给出最有可能的编码。这是一个非确定性的过程,而且必然会造成一定的效率损失

点评

那就比如,某文本文件是utf-16的编码,我该如何读取呢? ruby下输入了个File.public_methods……瞬间晕了,没找到  发表于 2010-8-8 14:32
回复 支持 反对

使用道具 举报

Lv3.寻梦者

小睡

梦石
0
星屑
2186
在线时间
508 小时
注册时间
2010-8-1
帖子
1378
29
 楼主| 发表于 2010-8-8 14:34:06 | 只看该作者
回复 紫苏 的帖子

在ruby 的文档里找到了这段:

a = File.new('some filename', 'rb:ASCII-8BIT') # strings from this will be read in as ASCII-8BIT
b = File.new('some filename', 'r') # strings from this will be read in as whatever the Encoding.default_external is
# you can change what the encoding will be
a.set_encoding "UTF-8" # from now on it will read in UTF-8
   
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
30
发表于 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")

点评

万分感谢,受教了~  发表于 2010-8-8 22:57
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-21 21:08

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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