【问题标题】:Ruby - How to unpack a binary string into a normal string?Ruby - 如何将二进制字符串解压缩为普通字符串?
【发布时间】:2011-03-06 22:35:43
【问题描述】:

我正在打开一个 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 转换为可以调用 ratio.to_f 的普通字符串?

谢谢。

【问题讨论】:

    标签: ruby string encoding binary unpack


    【解决方案1】:

    解包二进制字符串通常称为解码。看起来您的数据是 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
    

    【讨论】:

    • 反响也很好。谢谢!
    【解决方案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',看起来相当难看。)

    【讨论】:

    • 太棒了——让我试试。会告诉你进展如何!
    猜你喜欢
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多