Ruby CSV BOM | Кодировка UTF-8 для StringIO - PullRequest
2 голосов
/ 25 сентября 2019

Ruby 2.6.3.

Я пытался разобрать объект StringIO в экземпляр CSV с кодировкой bom|utf-8, чтобы символ спецификации (нежелательный) был удален исодержимое кодируется в 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?

Спасибо!

1 Ответ

0 голосов
/ 26 сентября 2019

Руби не любит спецификации.Он обрабатывает их только при чтении файла , нигде больше, и даже тогда он только читает их, чтобы избавиться от них.Если вам нужна спецификация для вашей строки или спецификация при написании файла, вы должны обработать ее вручную.

Возможно, для этого есть гемы, хотя это легко сделать самостоятельно

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
...