2014-01-09 121 views
0

短信我下載了一個製表符分隔的文件,我想創建一個腳本來讀它,但線出來是這樣的:Unicode轉換到紅寶石

"\xFF\xFEu\x00s\x00e\x00r\x00-\x00r\x00e\x00p\x00o\x00r\x00t\x00-\x00s\x00e\x00a 
\x00r\x00c\x00h\x00-\x00r\x00e\x00s\x00u\x00l\x00t\x00s\x00-\x002\x000\x001\x004 
\x000\x001\x000\x009\x001\x002\x000\x006\x000\x007\x00-\x00G\x00M\x00T\x00.\x00\ 
t\x00\t\x00\t\x00\t\x00\t\x00\t\x00\t\x00\t\x00\t\x00\t\x00\t\x00\t\x00\t\x00\t\ 
x00\r\x00\n" 

我相信我需要轉換( unicode?)轉換爲簡單的文本。有沒有這樣做的字符串方法?我搜查了the documentation,但無法理解哪個人能做到這一點。下面(有一系列選項卡)是我所看到的,當我打開一個普通的文本編輯器中的文件,上面引述行:

"user-report-search-results-20140109120607-GMT." 
+0

你可以提供你目前用來讀取文件的腳本,也可能是文件本身? – tessi

回答

0

經過一番研究,並與幫助從another forum,我設法使用CSV代替。這是我工作的代碼:

CSV.foreach(filename, { :row_sep => :auto, :col_sep => "\t", :encoding => 'UTF-16:UTF-8'}) do |row| 

最後,CSV更適合我,因爲這是一個製表符分隔的文件。

無論如何謝謝大家的意見!

0

您需要使用String#encode

旁白:看到所有那些空字符,我懷疑你的源編碼是utf16(不知道它是小的還是大的endian)。你可能想用utf8。

另外請注意,你可以轉換一個文件上飛:

>> f = File.open("iso-8859-1.txt", "r:iso-8859-1:utf-8") 
=> #<File:iso-8859-1.txt> 
>> f.external_encoding.name 
=> "ISO-8859-1" 
>> content = f.read 
=> "This file contains umlauts: äöü" 
>> content.encoding.name 
=> "UTF-8" 

http://nuclearsquid.com/writings/ruby-1-9-encodings/

又見此相關的問題:

Unicode null symbol in text parsed from file leading to failing equality checks

+0

檢查'#external_encoding'的用例是什麼?我以前從未使用它,因此詢問.. –

+0

我也沒有,tbh。該例子來自nuclearsquid.com。據我瞭解,它保存了原始文件的編碼,在Ruby轉換之前(在上面的utf8中)。我猜測也許有條件地轉換文件或東西的順序。 –

+0

f = File.open(filename,「r:utf-16:utf-8」)有效,但最終我能夠使用CSV,因爲這實際上是一個製表符分隔的文件。起初,我不認爲我可以使用它,因爲我有一些CSV格式錯誤的錯誤,但我設法找到一個解決方案,我將作爲答案張貼。無論如何,謝謝你的幫助! – PrincessLilly