2013-03-20 37 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

相关问题