Ruby - 如何将二进制字符串解压缩为普通字符串?

时间:2010-06-22 17:07:50

标签: ruby string encoding binary unpack

我正在打开一个CSV文件,并使用File.open(filename)从中读取值。

所以我这样做:

my_file = File.open(filename)
my_file.each_line do |line|
 line_array = line.split("\t")
 ratio = line_array[1]
 puts "#{ratio}"
 puts ratio.isutf8?
end

我遇到的问题是line_array中的值似乎是一种奇怪的格式。例如,CSV文件的单元格中的一个值是0.86。当我打印出来时,它看起来像“0.8 6”

所以它有点像字符串,但我不确定它是如何编码的。当我尝试做一些反省时:

ratio.isutf8?
I get this:
=> undefined method 'isutf8?' for "\0000\000.\0008\0006\000":String

到底发生了什么事?!如何将比率转换为普通字符串,然后我可以将其命名为ratio.to_f?

感谢。

2 个答案:

答案 0 :(得分:3)

解包二进制字符串通常称为解码。您的数据看起来像是UTF-16,但在应该假设这是真的之前,应该找到它实际使用的编码(例如通过调查产生它的工作流程/配置)。

在Ruby 1.9中(即时解码):

my_file = File.open(filename).set_encoding('UTF-16BE:UTF-8')
# the rest as in the original

在Ruby 1.8中(读入整个文件,然后解码并解析它;可能不适用于超大文件):

require 'iconv'

# …

my_file = File.open(filename)
my_text = Iconv.conv('UTF-8', 'UTF-16BE', my_file.read)
my_text.each_line do |line|
 # the rest as in the original
end

答案 1 :(得分:2)

您的输入数据看起来像UTF-16 or UCS-2

尝试这样的事情:

require 'iconv'

ratio = Iconv.conv('UTF-8', 'UTF-16', line_array[1])
puts "Ratio is now '#{ratio}'."

想想看,你应该在调用split之前在整行上运行Iconv.conv,否则在字符串的末尾会有杂散的零字节(除非你将分隔符更改为'\ 000 \ t',看起来很丑陋。)