2014-01-09 97 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