Re: [問題] 請教關於讀檔時多出來的字元 (非換行)

看板Ruby作者 (godfat 真常)時間14年前 (2010/05/25 12:40), 編輯推噓3(3011)
留言14則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《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

05/25 12:45, , 1F
真的獲益良多! 感謝耗費寶貴時間的回文!!
05/25 12:45, 1F

05/25 12:50, , 2F
趕緊來測試看看 ^^
05/25 12:50, 2F

05/25 12:55, , 3F
不過早上為了安裝 Rails 改用 1.8.7 版了 XD
05/25 12:55, 3F

05/25 12:55, , 4F
RoR 官方網站推薦 1.8.7 而不是推 1.9.1 所以...
05/25 12:55, 4F

05/25 12:57, , 5F
測試一: 改用 binary 模式開檔還是會有
05/25 12:57, 5F

05/25 13:02, , 6F
不過因為將陣列寫入檔案並沒有多出東西...
05/25 13:02, 6F

05/25 13:03, , 7F
所以目前是可以無視,只是看了不太順眼就是了...
05/25 13:03, 7F

05/25 13:06, , 8F
目前看起來應該是以 Encoding.default_internal
05/25 13:06, 8F

05/25 13:06, , 9F
是編碼方面問題比較好的方式
05/25 13:06, 9F

05/25 15:32, , 10F
呃,可是抱歉請看一下板規,請勿推文推太長 @@
05/25 15:32, 10F

05/26 00:33, , 11F
呃 (看板規中)
05/26 00:33, 11F

05/26 00:34, , 12F
啊...我修一下 @@
05/26 00:34, 12F

05/26 00:34, , 13F
唔...忘了這不是自己的文,以後會記得的
05/26 00:34, 13F

05/26 02:39, , 14F
:)
05/26 02:39, 14F
文章代碼(AID): #1B-rIajd (Ruby)
文章代碼(AID): #1B-rIajd (Ruby)