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 

當我打電話legacy_save方法的消息對象上的兩件事情可以happern:消息被正確保存當它僅包含ascii字符或者當它包含非ascii字符時引發異常。我試圖讓這個代碼工作,但沒有運氣。

我得到的例外是

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

我和String類如下面的代碼encode方法試過,但沒有運氣。

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

任何提示?

回答

1

調用encode()將文本從一種字符編碼轉碼爲另一種字符編碼。如果titlecontent包含無法編碼爲ISO-8859-1的字符,則Ruby將引發此異常。

我的答案假設Encoding::CompatibilityError異常是由您的LegacyMessage.create!行引發的。

相關問題