作者godfat (godfat 真常)
看板Ruby
标题Re: [问题] 请教关於读档时多出来的字元 (非换行)
时间Tue May 25 12:40:01 2010
※ 引述《johnnycgi (红茶不加糖)》之铭言:
: 环境: Windows 7, Ruby 1.9.1, NetBeans 6.8, utf-8 编码
: 状况: 弟刚自修 Ruby 第二天 (以前是自修 Perl)
: 今天练习写了一个读取档案并列印输出到萤幕的 Ruby 如下
: 1. 开启档案
: 2. 将档案以 line 为一单位放到阵列中并同时输出到萤幕
: 但是使用 p 列印查看结果
: 却发现阵列中的某行开头 (通常是第一行或者倒数第二行)
: 多了一个字元 # 有点像 "‧"
: 想了很久还是不知道那个字元到底哪来的 囧
: 不好意思第一篇文就来麻烦大家
有几件事可以测试,第一个就是 TonyQ 板友提到的 utf-8 bom,
排除这个之後,可以试试看用 binary mode 去读档
就是原本写 File.open filename, 'r' 那边改成 'rb'
在 windows 下这有差别,差在 ruby 是会把 CRLF 转成 LF 的,
用 binary mode 可以关闭这样的转换。也因此,在 windows 下,
text mode file I/O 的速度非常慢,比 ruby 1.8 慢上数十甚至数百倍。
如果这速度问题很严重的话,就一律使用 binary mode, 不要用 text mode.
另一方面,ruby 1.9 有 encoding 的问题,你试试看这个:
p Encoding.default_external
如果是 big-5 的话,那就很可能有问题了。这跟 locale 有关。
这边作法也很多种,一种是指定 default encoding:
Encoding.default_external = 'utf-8'
另一种是在执行 ruby 时加上个 -U 参数
最後一种则是针对档案指定 encoding:
File.open(filename, 'r:utf-8::with-bom')
这样指定你的读档用 utf-8, 而且假设有 bom.
除此之外,如果有 Encoding.default_internal 的话,
ruby 在做 I/O 时会自动帮你 transcode.
ruby 1.9 在 encoding 上面下了很多很多的工夫,
好不好用,目前我还看不太出来,但真的很强大就是了。
另外还有 magic comment, 在档案开头写:
# encoding: utf-8
这样可以指定这个档案的编码使用 utf-8
--
生死去来、棚头傀儡、一线断时、落落磊磊
《花镜》-世阿弥
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.168.129.122
1F:推 johnnycgi:真的获益良多! 感谢耗费宝贵时间的回文!! 05/25 12:45
2F:→ johnnycgi:赶紧来测试看看 ^^ 05/25 12:50
3F:推 johnnycgi:不过早上为了安装 Rails 改用 1.8.7 版了 XD 05/25 12:55
4F:→ johnnycgi:RoR 官方网站推荐 1.8.7 而不是推 1.9.1 所以... 05/25 12:55
5F:→ johnnycgi:测试一: 改用 binary 模式开档还是会有 05/25 12:57
6F:→ johnnycgi:不过因为将阵列写入档案并没有多出东西... 05/25 13:02
7F:→ johnnycgi:所以目前是可以无视,只是看了不太顺眼就是了... 05/25 13:03
8F:→ johnnycgi:目前看起来应该是以 Encoding.default_internal 05/25 13:06
9F:→ johnnycgi:是编码方面问题比较好的方式 05/25 13:06
10F:→ godfat:呃,可是抱歉请看一下板规,请勿推文推太长 @@ 05/25 15:32
11F:推 johnnycgi:呃 (看板规中) 05/26 00:33
12F:→ johnnycgi:啊...我修一下 @@ 05/26 00:34
13F:→ johnnycgi:唔...忘了这不是自己的文,以後会记得的 05/26 00:34
14F:→ godfat::) 05/26 02:39