作者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
推 johnnycgi:真的獲益良多! 感謝耗費寶貴時間的回文!! 05/25 12:45
→ johnnycgi:趕緊來測試看看 ^^ 05/25 12:50
推 johnnycgi:不過早上為了安裝 Rails 改用 1.8.7 版了 XD 05/25 12:55
→ johnnycgi:RoR 官方網站推薦 1.8.7 而不是推 1.9.1 所以... 05/25 12:55
→ johnnycgi:測試一: 改用 binary 模式開檔還是會有 05/25 12:57
→ johnnycgi:不過因為將陣列寫入檔案並沒有多出東西... 05/25 13:02
→ johnnycgi:所以目前是可以無視,只是看了不太順眼就是了... 05/25 13:03
→ johnnycgi:目前看起來應該是以 Encoding.default_internal 05/25 13:06
→ johnnycgi:是編碼方面問題比較好的方式 05/25 13:06
→ godfat:呃,可是抱歉請看一下板規,請勿推文推太長 @@ 05/25 15:32
推 johnnycgi:呃 (看板規中) 05/26 00:33
→ johnnycgi:啊...我修一下 @@ 05/26 00:34
→ johnnycgi:唔...忘了這不是自己的文,以後會記得的 05/26 00:34
→ godfat::) 05/26 02:39