Ruby 中的 CSV.open 中的 rb:bom|utf-8 是啥意思?
Posted
技术标签:
【中文标题】Ruby 中的 CSV.open 中的 rb:bom|utf-8 是啥意思?【英文标题】:What does rb:bom|utf-8 mean in CSV.open in Ruby?Ruby 中的 CSV.open 中的 rb:bom|utf-8 是什么意思? 【发布时间】:2019-07-15 02:08:32 【问题描述】:'rb:bom|utf-8'
是什么意思:
CSV.open(csv_name, 'rb:bom|utf-8', headers: true, return_headers: true) do |csv|
我可以理解:
r
表示已读
bom
是一种文件格式,\xEF\xBB\xBF
在文件的开头
表示字节顺序。
utf-8
是一种文件格式
但是:
-
我不知道它们是如何组合在一起的,为什么需要编写所有这些来读取 csv
我正在努力寻找相关文档
这。它似乎没有记录在https://ruby-doc.org/stdlib-2.6.1/libdoc/csv/rdoc/CSV.html
更新:
找到一个非常有用的文档: https://ruby-doc.org/core-2.6.3/IO.html#method-c-new-label-Open+Mode
【问题讨论】:
查看@matt 的回答here。 【参考方案1】:(接受的答案不正确但不完整)
rb:bom|utf-8
转换成人类可读的句子意思是:
以二进制模式 (b
) 打开文件以读取 (r
) 并查找 Unicode BOM 标记 (bom
) 以检测编码,或者,如果未找到 BOM 标记,假设 UTF-8 编码 (utf-8
)。
BOM 标记可用于检测文件是 UTF-8 还是 UTF-16,如果是 UTF-16,无论是小端还是大端 UTF-16。还有一个用于 UTF-32 的 BOM 标记,但 Ruby 目前还不支持 UTF-32。 BOM 标记只是 Unicode 标准中的一个特殊保留字节序列,仅用于检测文件的编码,它必须是该文件的第一个“字符”。推荐并通常用于 UTF-16,因为它有两种不同的变体,它对于 UTF-8 是可选的,通常如果文件是 Unicode 但没有 BOM 标记,则假定为 UTF-8。
【讨论】:
能否提供参考?我找不到任何解释上述内容的官方文档。我不确定在这种情况下阅读为binary
而不是text
是如何工作的
@rellampec 这一切都记录在 Ruby IO 文档页面上docs.ruby-lang.org/en/2.1.0/IO.html 寻找“打开模式”并继续阅读。【参考方案2】:
在 Ruby 中读取文本文件时,您需要指定编码,否则它将恢复为默认值,这可能是错误的。
如果您正在读取 BOM 编码的 CSV 文件,那么您需要这样做。
纯 UTF-8 编码无法处理 BOM 标头,因此您需要阅读它并跳过该部分,然后再将数据视为 UTF-8。这种表示法就是 Ruby 表达该要求的方式。
【讨论】:
值得一提的是,r
和 :bom
之间的b
表示binary
。以上是关于Ruby 中的 CSV.open 中的 rb:bom|utf-8 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章