我正在將Rails 3.2.13應用程序從Ruby 1.8.7-p370升級到Ruby 1.9.3-p385。升級後,特殊字符在從數據庫檢索到的文本中出現亂碼。例如「café」顯示爲「café」。我的數據庫是latin1編碼的。我使用mysql2(0.3.11)和我database.yml
這個樣子的:從Ruby 1.8.7升級到1.9.3的Rails 3應用停止尊重database.yml中的latin1編碼規範
development:
adapter: mysql2
encoding: latin1
database: my_db
username: root
host: localhost
(同樣的問題也發生在生產環境中,具有相同的數據庫配置。)
看樣子當ActiveRecord從數據庫中檢索文本時,它將它解碼爲utf-8,而不是像我指定的那樣對latin1(或ISO-8859-1)進行解碼。
要診斷的問題,我寫了一個Ruby腳本,使用mysql2直接查詢數據庫,繞過ActiveRecord的:
require 'rubygems'
require 'mysql2'
client = Mysql2::Client.new(:host => "localhost",
:username => "root",
:database => "food52_development_production",
:encoding => "latin1")
result = client.query('SELECT title FROM recipes WHERE id = 12934')
puts result.first["title"]
ID爲12934配方在其標題中註明「咖啡館」。在1.9.3中運行此腳本會輸出正確解碼的文本(「café」)。如果我將:encoding
選項更改爲"utf-8"
,我會再次看到亂碼文本(「café」)。
我也嘗試在ActiveRecord::ConnectionAdapters
中放置一個斷點,以瞭解如何使用什麼編碼配置Rails初始化Mysql2::Client
。正如預期的那樣,它正在通過。
然而:Rails決定將文本解碼爲utf-8。我如何讓Rails尊重我指定的latin1編碼配置?在此先感謝您的幫助。
什麼是您的系統規格? – tylerdavis 2013-03-20 16:14:06
@tylerdavis,我正在運行OS X 10.8.2,但同樣的問題發生在Ubuntu的生產環境中。 – hoffm 2013-03-20 16:18:04