在Ruby的CSV.open中,rb:bom|utf-8是什么意思?

3
这段代码的含义是什么:'rb:bom|utf-8'
我可以理解:
  1. r 表示读取
  2. bom 是一种文件格式,在文件开头有 \xEF\xBB\xBF,用于表示字节序。
  3. utf-8 是一种文件格式
但是:
  1. 我不知道它们如何结合在一起,以及为什么需要为读取 csv 文件编写所有这些内容
  2. 我正在努力寻找文档,但似乎没有在 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

1
请参考@matt在这里的答案。 - Cary Swoveland
2个回答

6

(被接受的答案并不是错误的,但是不完整)

rb:bom|utf-8 转化为人类可读的语句即:

以二进制模式 (b) 打开文件进行读取 (r) 并查找 Unicode BOM 标记 (bom) 来检测编码方式,如果没有找到 BOM 标记,则假定该文件采用 UTF-8 编码 (utf-8)。

BOM 标记可用于检测文件是否为 UTF-8 或 UTF-16 以及在文件为 UTF-16 时,它是使用小端还是大端 UTF-16。目前 Ruby 还不支持 UTF-32 的 BOM 标记。BOM 标记只是 Unicode 标准中的特殊保留字节序列,仅用于检测文件的编码方式,并且必须是该文件的第一个“字符”。它通常用于 UTF-16,因为它有两个不同的变体;对于 UTF-8 来说,它是可选的,如果文件是 Unicode 但没有 BOM 标记,则假定它是 UTF-8。


请问你能提供一个参考资料吗?我找不到任何官方文档来解释上述问题。我不确定为什么在这种情况下以“二进制”而不是“文本”方式读取会起作用。 - rellampec
1
@rellampec 这些都在Ruby IO文档页面上有详细记录 https://docs.ruby-lang.org/en/2.1.0/IO.html 找到"打开模式"并继续阅读。 - Mecki

1
当使用Ruby读取文本文件时,您需要指定编码,否则它将恢复默认值,这可能是错误的。
如果您正在阅读BOM编码的CSV文件,则需要按照这种方式操作。
纯UTF-8编码无法处理BOM标题,因此您需要在将数据视为UTF-8之前读取并跳过该部分。这种表示法是Ruby表达该要求的方式。

1
еҖјеҫ—дёҖжҸҗзҡ„жҳҜпјҢеңЁrе’Ң:bomд№Ӣй—ҙзҡ„bиЎЁзӨәдәҢиҝӣеҲ¶гҖӮ - Aleksei Matiushkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接