我正在使用一个最近添加了Unicode BOM头(U+FEFF)的数据源,我的rake任务现在被它搞砸了.

我可以用file.gets[3..-1]跳过前3个字节,但是有没有一种更优雅的方法来读取Ruby中的文件,无论是否存在BOM表,都可以正确处理这个问题?

推荐答案

使用ruby 1.9.2,您可以使用模式r:bom|utf-8

text_without_bom = nil #define the variable outside the block to keep the data
File.open('file.txt', "r:bom|utf-8"){|file|
  text_without_bom = file.read
}

text_without_bom = File.read('file.txt', encoding: 'bom|utf-8')

text_without_bom = File.read('file.txt', mode: 'r:bom|utf-8')

It doesn't matter, if the BOM is available in the file 或 not.


您还可以将"编码"选项与其他命令一起使用:

text_without_bom = File.readlines(@filename, "r:utf-8")

(得到一个包含所有行的数组).

或使用CSV:

require 'csv'
CSV.open(@filename, 'r:bom|utf-8'){|csv|
  csv.each{ |row| p row }
}

Ruby相关问答推荐

如何使用另一个Ruby 中的Ruby 中的区域设置?

当 node 名称是/包含整数时,使用 Nokogiri 解析非 XML 文档

如何在 Shopify 脚本编辑器中显示数组值?

如何使用 HEREDOC 作为参数传递给方法?

Python 正则表达式是否等同于 Ruby 的原子分组?

Ruby 相当于 Groovy 的 Elvis (?:) 运算符?

如何在新行之间拆分字符串并保留空白行?

如何关闭 Rails 3.1 上的自动样式表/javascript 生成?

如何在 Ruby 中初始化 Hash 中的数组

如何在两个浮点数之间的范围内最好地创建一个随机浮点数

按可能为 nil 的属性对对象的 ruby​​ 数组进行排序

如何判断是否安装了gem?

我应该在我的 ruby​​ 脚本中定义一个 main 方法吗?

如何在 ruby​​ rake 中明确地失败任务?

确定一个值是否存在于哈希数组中

Ruby on rails - 静态方法

为什么 Ruby 无法验证 SSL 证书?

如何打破Ruby中的外循环?

使用 Ruby CSV 在导出的 CSV 中更改字段分隔符/分隔符

Rubocop 25 线块大小和 RSpec 测试