从Ruby的zip流中剥离字节顺序标记

时间:2018-10-15 14:01:42

标签: ruby csv encoding inputstream

我知道File应该使用encoding: 'bom|utf-8',但是流没有等效项。我的服务器正在获取一个zip文件,其中包含一个带bom的csv。将csv保存为文件与仅使用CSV.new(Zip::InputStream::open(zip_file).get_next_entry.get_input_stream)相比似乎很愚蠢,但是没有一个人可以检测并剥离字节顺序标记(bom),并且CSV尝试在bom解析标题时失败在那儿。

我看到CSV.newencoding作为选项,但是至少在2.3.0中,它无法识别bomArgumentError: unknown encoding name - bom

3 个答案:

答案 0 :(得分:1)

好像在IO中实现了BOM的处理-也许您可以将zip流包裹在IO对象周围?

https://ruby-doc.org/core-2.3.1/IO.html#method-c-new-label-Open+Mode

答案 1 :(得分:0)

由于可以倒带流,答案是获取第一个字符,看看它们是否是bom,如果是,则消耗它们;否则,倒带该流。

BYTE_ORDER_MARKS_LENGTHS =
  {"\xEF".bytes.first => 2, "\xFE".bytes.first => 1, "\xFF".bytes.first => 1}
# checks if input_stream starts with a byte order mark and if so skips over it
def skip_bom(input_stream)
  entry = BYTE_ORDER_MARKS_LENGTHS[input_stream.read(1).bytes.first]
  if entry
    input_stream.read(entry)
  else
    input_stream.rewind
  end
end

答案 2 :(得分:0)

我的情况与此类似,但我还需要删除多余的双引号:

authorize()