【发布时间】:2020-01-25 20:52:47
【问题描述】:
Ruby 2.6.3。
我一直在尝试使用bom|utf-8 编码将StringIO 对象解析为CSV 实例,以便剥离BOM 字符(不需要的)并将内容编码为UTF-8:
require 'csv'
CSV_READ_OPTIONS = { headers: true, encoding: 'bom|utf-8' }.freeze
content = StringIO.new("\xEF\xBB\xBFid\n123")
first_row = CSV.parse(content, CSV_READ_OPTIONS).first
first_row.headers.first.include?("\xEF\xBB\xBF") # This returns true
显然bom|utf-8 编码不适用于StringIO 对象,但我发现它确实适用于文件,例如:
require 'csv'
CSV_READ_OPTIONS = { headers: true, encoding: 'bom|utf-8' }.freeze
# File content is: "\xEF\xBB\xBFid\n12"
first_row = CSV.read('bom_content.csv', CSV_READ_OPTIONS).first
first_row.headers.first.include?("\xEF\xBB\xBF") # This returns false
考虑到我需要直接使用StringIO,为什么CSV 会忽略bom|utf-8 编码?有什么方法可以从 StringIO 实例中删除 BOM 字符?
谢谢!
【问题讨论】:
-
在创建 StringIO 实例或基于没有 BOM 的 UTF-8 字符串创建另一个实例之前不能删除 BOM 吗?所有已发布的 StringIO 版本都不支持 BOM 处理。
-
问题是(从 Ruby 2.4 开始)BOM 是 files 的属性,而不是编码。如果您已经有一个编码字符串,则没有 BOM 之类的东西,因为字符已经根据 BOM 正确读取,现在不需要它了。由于 StringIO 是由字符串支持的——不是文件——它也不理解 BOM。
标签: ruby csv utf-8 byte-order-mark ruby-csv