【发布时间】:2013-03-20 16:10:44
【问题描述】:
我正在将 Rails 3.2.13 应用程序从 Ruby 1.8.7-p370 升级到 Ruby 1.9.3-p385。升级后,从数据库中检索到的文本中的特殊字符出现乱码。例如,“café”显示为“café”。我的数据库是 latin1 编码的。我正在使用 mysql2 (0.3.11),我的 database.yml 看起来像这样:
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 的编码配置。正如预期的那样,它正在通过:encoding => "latin1"。
然而:在某个地方,Rails 决定将文本解码为 utf-8。如何让 Rails 尊重我指定的 latin1 编码配置?提前感谢您的帮助。
【问题讨论】:
-
您的系统规格是什么?
-
@tylerdavis,我运行的是 OS X 10.8.2,但同样的问题出现在生产环境中,即 Ubuntu。
标签: ruby-on-rails-3 character-encoding ruby-1.9 mysql2 latin1