Удаление метки порядка байтов из потока zip в ruby - PullRequest
0 голосов
/ 15 октября 2018

Я знаю, что File предположительно занимает encoding: 'bom|utf-8', но на самом деле нет эквивалента для потоков.Мой сервер получает ZIP-файл, содержащий один CSV, который имеет бомбу.Кажется глупым сохранять CSV-файл как файл против использования CSV.new(Zip::InputStream::open(zip_file).get_next_entry.get_input_stream), но на самом деле никто из них не может обнаружить и убрать метку порядка байтов (bom), и CSV не удается проанализировать заголовок, если bom есть.

Я вижу, что CSV.new принимает encoding в качестве опции, но, по крайней мере, в 2.3.0 он не распознает bom (ArgumentError: unknown encoding name - bom)

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Похоже, обработка спецификации реализована в IO - может быть, вы можете обернуть свой поток zip вокруг объекта IO?

https://ruby -doc.org / core-2.3.1 / IO.html # способ-с-новая этикетка Open + Mode

0 голосов
/ 05 апреля 2019

Моя ситуация была похожей, но мне также нужно было удалить лишние двойные кавычки:

Zip::File.open(zipfolder) do |zipfile|
  zipfile.each do |zip_entry|
    zip_entry.get_input_stream.each_line do |line|
      line_without_bom_or_quotes = line.force_encoding('UTF-8').gsub('"', '')
      row = CSV.parse_line(line_without_bom_or_quotes)
      puts "DETAIL: #{row.inspect}"
    end
  end
end
0 голосов
/ 16 октября 2018

Поскольку вы можете перематывать потоки, ответ состоит в том, чтобы получить первые символы, посмотреть, являются ли они бомбой, если они есть, потреблять их;в противном случае перемотайте поток.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...