Проблема кодировки символов в Rails v3 / Ruby 1.9.2 - PullRequest
7 голосов
/ 15 января 2011

Иногда я получаю эту ошибку " недопустимая последовательность байтов в UTF-8 ", когда я читаю содержимое из файла.Обратите внимание - это происходит только тогда, когда в строке есть специальные символы.Я пытался открыть файл без "r: UTF-8", но все равно получаю ту же ошибку.

open(file, "r:UTF-8").each_line { |line| puts line.strip(",") } # line.strip generates the error

Содержимое файла:

# encoding: UTF-8
290919,"SE","26","Sk‰l","",59.4500,17.9500,, # this errors out
290956,"CZ","45","HornÌ Bradlo","",49.8000,15.7500,, # this errors out
290958,"NO","02","Svaland","",58.4000,8.0500,, # this works

Это CSV-файл, который я получил извне, и я пытаюсь импортировать его в свою БД, в нем нет «# encoding: UTF-8» вверху, но я добавил его, так как где-то читал, это исправитпроблема, но это не так.: (*

Среда:

  • Rails v3.0.3
  • ruby ​​1.9.2p0 (2010-08-18 редакция 29036) [x86_64-darwin10.5.0]

Ответы [ 2 ]

16 голосов
/ 15 января 2011

В Ruby есть понятие внешней кодировки и внутренней кодировки для каждого файла.Это позволяет вам работать с файлом в формате UTF-8 в вашем источнике, даже если файл хранится в более эзотерическом формате.Если ваша внешняя кодировка по умолчанию - UTF-8 (как и в Mac OS X), весь ваш файловый ввод / вывод будет также в UTF-8.Вы можете проверить это, используя File.open('file').external_encoding.То, что вы делаете, когда открываете свой файл и передаете "r:UTF-8", принудительно используют ту же внешнюю кодировку, которую Ruby использует по умолчанию.

Скорее всего, ваш исходный документ не в UTF-8, и эти символы, не относящиеся к ascii, не отображаются должным образом в UTF-8 (если бы они были, вы бы получили правильные символы и без ошибок,и если они отображаются неправильно, вы получите неправильные символы и без ошибок).Что вы должны сделать, это попытаться определить кодировку исходного документа, а затем сделать так, чтобы Ruby перекодировал документ при прочтении, например так:

File.open(file, "r:windows-1251:utf-8").each_line { |line| puts line.strip(",") }

Если вам нужна помощь в определении кодировки источника, введите эта библиотека Python вихрь.Он основан на автоматическом обнаружении кодировки в Seamonkey / Mozilla (и, возможно, все еще в Firefox).

6 голосов
/ 20 февраля 2012

Если вы хотите изменить кодировку файла, вы можете использовать gem 'charlock holmes'

https://github.com/brianmario/charlock_holmes

$require 'charlock_holmes/string'
content = File.read('test2.txt')
if !content.is_utf8?
  detection = CharlockHolmes::EncodingDetector.detect(content)
  utf8_encoded_content = CharlockHolmes::Converter.convert content, detection[:encoding], 'UTF-8'
end

Затем вы можете сохранить новый контент во временном файле и перезаписать исходный файл.
Надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...