Есть ли способ удалить спецификацию из файла в кодировке UTF-8? - PullRequest
27 голосов
/ 16 февраля 2011

Есть ли способ удалить спецификацию из файла в кодировке UTF-8?

Я знаю, что все мои файлы JSON кодируются в кодировке UTF-8, но специалист по вводу данных, который редактировал файлы JSONсохранил его как UTF-8 с спецификацией.

Когда я запускаю свои сценарии Ruby для анализа JSON, происходит сбой с ошибкой.Я не хочу открывать 58+ JSON-файлы вручную и конвертировать в UTF-8 без спецификации.

Ответы [ 5 ]

32 голосов
/ 16 октября 2011

С ruby> = 1.9.2 вы можете использовать режим r:bom|utf-8

Это должно работать (я не проверял его в сочетании с json):

json = nil #define the variable outside the block to keep the data
File.open('file.txt', "r:bom|utf-8"){|file|
  json = JSON.parse(file.read)
}

Не имеет значения, доступна ли спецификация в файле или нет.


Эндрю заметил, что File#rewind нельзя использовать с спецификацией.

Если вам нужна функция перемотки, вы должны запомнить положение и заменить rewind на pos=:

#Prepare test file
File.open('file.txt', "w:utf-8"){|f|
  f << "\xEF\xBB\xBF" #add BOM
  f << 'some content'
}

#Read file and skip BOM if available
File.open('file.txt', "r:bom|utf-8"){|f|
  pos =f.pos
  p content = f.read  #read and write file content
  f.pos = pos   #f.rewind  goes to pos 0
  p content = f.read  #(re)read and write file content
}
20 голосов
/ 16 февраля 2011

Итак, решение было сделать поиск и замену в спецификации через gsub!Я принудительно закодировал строку в UTF-8, а также заставил кодировать регулярное выражение в UTF-8.

Я смог найти решение, посмотрев на http://self.d -структуру.org / 195 / howto-remove-byte-order-mark-with-ruby-and-iconv и http://blog.grayproductions.net/articles/ruby_19s_string

def read_json_file(file_name, index)
  content = ''
  file = File.open("#{file_name}\\game.json", "r") 
  content = file.read.force_encoding("UTF-8")

  content.gsub!("\xEF\xBB\xBF".force_encoding("UTF-8"), '')

  json = JSON.parse(content)

  print json
end
7 голосов
/ 10 мая 2013

Вы также можете указать кодировку с помощью методов File.read и CSV.read, но не указывайте режим read.

File.read(path, :encoding => 'bom|utf-8')
CSV.read(path, :encoding => 'bom|utf-8')
3 голосов
/ 14 ноября 2014

кодировка "bom | UTF-8" работает хорошо, если вы читаете файл только один раз, но не работает, если вы когда-либо вызываете File # rewind, как я делал в своем коде.Чтобы решить эту проблему, я сделал следующее:

def ignore_bom
  @file.ungetc if @file.pos==0 && @file.getc != "\xEF\xBB\xBF".force_encoding("UTF-8")
end

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

0 голосов
/ 28 августа 2018

Очистка на стороне сервера от UTF-8 байтов BOM, которые работали для меня:

csv_text.gsub!("\xEF\xBB\xBF".force_encoding(Encoding::BINARY), '')
...