2013-03-20 15 views
0

我正在將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編碼配置?在此先感謝您的幫助。

+0

什麼是您的系統規格? – tylerdavis 2013-03-20 16:14:06

+0

@tylerdavis,我正在運行OS X 10.8.2,但同樣的問題發生在Ubuntu的生產環境中。 – hoffm 2013-03-20 16:18:04

回答

1

從1.9.3開始,iconv已被棄用。另外,Rails 3希望所有輸入都使用UTF-8編碼。

就這麼說,你有幾個不同的選擇。第一個,很不好意思,但如果你不想遷移你的數據,它就會工作。

iconv庫仍可作爲gem使用,您應該可以使用它手動在您的應用程序中根據需要執行這些轉換。

在Airbnb的人在使用一個輔助這樣的:

def self.convert_string_encoding(to, from, str) 
    if "1.9".respond_to?(:force_encoding) 
    str = str.dup if str.frozen? 
    str.encode(to, from, :undef => :replace) 
    else 
    require 'iconv' 
    Iconv.conv(to, from, str) 
    end 
end 

來處理轉換。你可能會把這個視爲幫助你的觀點。

你可以閱讀更多關於他們的遷移here

試圖Rails的默認UTF-8回你的數據庫轉換編碼時,問題會。

可能更有意義的是在現有數據上進行UTF-8遷移。

This article seems to cover that fairly well.

我希望這有助於!

+0

因此,'some_string.encode('ISO-8859-1','utf-8')'轉換就好了:https://gist.github。com/hoffm/5207153 但是,我不知道如何使用這些信息來修復我的應用程序。 – hoffm 2013-03-20 18:22:16

+0

可以在線獲得可以爲數據庫嘗試的補丁程序,也可以執行一次腳本將數據庫中的所有字段重新編碼爲UTF-8。其中一個問題是,Rails認爲UTF-8是默認的,因此數據重新編碼腳本可能是您繼續前進的最佳選擇。 [這是關於如何轉換數據庫的文章。](http://climbtothestars.org/archives/2004/07/18/converting-mysql-database-contents-to-utf-8/) 另一個[另一篇文章](http://yehudakatz.com/2010/05/17/encodings-unabridged/)上關於1.9和Rails 3的區別。 – tylerdavis 2013-03-20 19:10:54

+0

謝謝,泰勒。我計劃最終完成轉換,但我希望不必與1.9遷移同時進行。 – hoffm 2013-03-20 19:44:36

相關問題