首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby CSV BOM| StringIO的UTF-8编码

Ruby CSV BOM| StringIO的UTF-8编码
EN

Stack Overflow用户
提问于 2019-09-25 23:47:05
回答 3查看 2.2K关注 0票数 6

Ruby 2.6.3。

我一直在尝试将一个StringIO对象解析成一个使用bom|utf-8编码的CSV实例,这样就去掉了BOM字符(不需要的),并将内容编码为bom|utf-8-8:

代码语言:javascript
复制
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对象,但我发现它确实适用于文件,例如:

代码语言:javascript
复制
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实例中删除物料清单字符?

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2019-09-27 00:34:50

露比不喜欢炸弹。它只在读取文件时处理它们,而不是在其他任何地方,即使在其他地方,它也只是读取它们,以便可以删除它们。如果字符串需要BOM表,或者在写入文件时需要BOM表,则必须手动处理。

做这件事可能有一些好办法,尽管你自己做起来很容易

代码语言:javascript
复制
if string[0...3] == "\xef\xbb\xbf"
  string = string[3..-1].force_encoding('UTF-8')
elsif string[0...2] == "\xff\xfe"
  string = string[2..-1].force_encoding('UTF-16LE')
# etc
票数 2
EN

Stack Overflow用户

发布于 2019-10-08 20:09:49

我发现在StringIO string上强制对utf8进行编码并删除物料清单以生成新的StringIO是可行的:

代码语言:javascript
复制
require 'csv'
CSV_READ_OPTIONS = { headers: true}.freeze
content = StringIO.new("\xEF\xBB\xBFid\n123")
csv_file = StringIO.new(content.string.force_encoding('utf-8').sub("\xEF\xBB\xBF", ''))
first_row = CSV.parse(csv_file, CSV_READ_OPTIONS).first

first_row.headers.first.include?("\xEF\xBB\xBF") # => false  

不再需要encoding选项。这可能不是内存方面的最佳选择,但它是有效的。

票数 2
EN

Stack Overflow用户

发布于 2020-05-13 03:49:41

Ruby2.7在IO中添加了set_encoding_by_bom方法。此方法使用字节顺序标记并设置编码。

代码语言:javascript
复制
require 'csv'
require 'stringio'

CSV_READ_OPTIONS = { headers: true }.freeze

content = StringIO.new("\xEF\xBB\xBFid\n123")
content.set_encoding_by_bom

first_row = CSV.parse(content, CSV_READ_OPTIONS).first
first_row.headers.first.include?("\xEF\xBB\xBF")
#=> false
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58102188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档