Перемещение данных по базе данных с использованием другой кодировки в ruby ​​1.9: «Encoding :: CompatibilityError: несовместимые кодировки символов: UTF-8 и ISO-8859-1» - PullRequest
0 голосов
/ 09 декабря 2011

Я написал приложение на ruby ​​1.9.3 / rails 3.1.0, которое работает с mysql в качестве базы данных и utf8 в качестве кодировки для всего.Теперь я должен записать некоторые данные этого нового приложения также в унаследованную базу данных, которая использует latin1 в качестве кодировки.Это мои настройки базы данных

# database.yml
development:
  adapter: sqlite3
  encoding: utf8

production:
  adapter: mysql2
  encoding: utf8
  # other params

legacy:
  adapter: mysql2
  encoding: latin1

И это (упрощенная версия) моих моделей

class Message < ActiveRecord::Base
  attr_accessible :title, :content

  def legacy_save
    LegacyMessage.create!(title: title, content: content)
  end
end

class LegacyMessage < ActiveRecord::Base
  estabilish_connection 'legacy' # actually I'm using octopus gem to do this connection
end

Когда я вызываю метод legacy_save для объекта Message, могут произойти две вещи:сообщение сохраняется правильно, если оно содержит только символы ascii или возникает исключение, если оно содержит символы не ascii.Я пытаюсь заставить этот код работать, но безуспешно.

Исключение, которое я получил, это

Encoding::CompatibilityError: incompatible character encodings: UTF-8 and ISO-8859-1

Я пытался с кодировать методСтроковый класс, как в следующем коде, но безуспешно.

def legacy_save
  LegacyMessage.create!(title: title.encode('ISO-8859-1'), 
                        content: content.encode('ISO-8859-1')
  )
end

Есть подсказка?

1 Ответ

1 голос
/ 02 марта 2012

Вызов encode() перекодирует текст из одной кодировки символов в другую.Если title или content содержит символы, которые не могут быть закодированы как ISO-8859-1, Ruby вызовет это исключение.

В моем ответе предполагается, что исключение Encoding::CompatibilityError вызвано вашим LegacyMessage.create!линия.

...