0

ruby​​ 1.9.3/rails 3.1.0でアプリケーションを作成しました。 mysqlをデータベースとして、utf8をすべてのエンコーディングとして使用します。今では、この新しいアプリケーションのいくつかのデータを、latin1をエンコーディングとして使用するレガシーデータベースにも書き込む必要があります。これは私のデータベースのセットアップRuby 1.9で異なるエンコーディングでデータを移動する: "Encoding :: CompatibilityError:互換性のない文字エンコーディング:UTF-8とISO-8859-1"

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

production: 
    adapter: mysql2 
    encoding: utf8 
    # other params 

legacy: 
    adapter: mysql2 
    encoding: latin1 

であり、これらは私のモデル(のsemplifiedバージョン)です

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 

私はMessageオブジェクトにlegacy_saveメソッドを呼び出すと二つのことがhappernすることができます:メッセージが正しく保存されますそれがアスキー文字だけを含む場合、またはアスキー文字以外の文字が含まれている場合は例外が発生します。私はこのコードを稼働させようとしていますが、運がありません。

私が得た例外は、私は次のコードのように、文字列クラスのencode方法を試してみた

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

encode()を呼び出すと、ある文字エンコーディングから別のエンコーディングにテキストがトランスコードされます。 titleまたはcontentにISO-8859-1としてエンコードできない文字が含まれている場合、Rubyはこの例外を発生させます。

私の答えはEncoding::CompatibilityError例外があなたのLegacyMessage.create!行によって発生していることを前提としています。

関連する問題