从Ruby中读取UTF-16编码文件中的内容

时间:2014-07-16 17:02:55

标签: ruby encoding utf-16

我想读取文件的内容并将其保存到变量中。通常我会做类似的事情:

text = File.read(filepath)

不幸的是,我正在使用的文件是用UTF-16LE编码的。我一直在做一些研究,看起来我需要使用File.Open来定义编码。我在某个地方读到了一个建议,即打开文件并逐行读取数据:

text = File.open(filepath,"rb:UTF-16LE") { |file| file.lines }

但是,如果我跑:

puts text

我明白了:

#<Enumerator:0x23f76a8>

如何将UTF-16LE文件的内容读入变量?

注意:我使用的是Ruby 1.9.3和Windows操作系统

2 个答案:

答案 0 :(得分:6)

不推荐使用lines方法。如果您希望text是包含行的数组,请使用readlines

text = File.open(filepath,"rb:UTF-16LE"){ |file| file.readlines }

正如Tin Man所说,如果可能的话,最好分开处理每一条线:

File.open("test.csv", "rb:UTF-16LE") do |file|
  file.each do |line|
    p line
  end
end

答案 1 :(得分:1)

首先,除非你绝对必须,否则不要将文件直接读入变量。这被称为&#34; slurping&#34;,并且不具备可扩展性。相反,请逐行阅读。

Ruby的IO类,File继承自,支持一个名为open_args的参数,这是一个哈希,大部分是&#34; read&#34;打字电话。例如,以下是一些方法签名:

read(name, [length [, offset]], open_args)
readlines(name, sep=$/ [, open_args])

The documentationopen_args

If the last argument is a hash, it specifies option for internal open().  The
key would be the following.  open_args: is exclusive to others.

encoding:
  string or encoding

  specifies encoding of the read string.  encoding will be ignored if length
  is specified.


mode:
  string

  specifies mode argument for open().  It should start with "r" otherwise it
  will cause an error.


open_args:
  array of strings


  specifies arguments for open() as an array.