2

升级到 ruby​​ 1.9 后,我们开始注意到当用户使用非 ASCII 字符时,页面无法从 rails 模板渲染器渲染。特别是“é”。我能够在我们的一台登台服务器上解决此问题,但我无法在我们的生产服务器上重现该修复程序。

第一次似乎有效的修复:

  1. 使用此处提供的 convert_charset 工具将数据库从 latin1 转换为 utf8:http ://www.mysqlperformanceblog.com/2009/03/17/converting-character-sets/ 。(包括default_character_set=utf8在 my.cnf 中设置和运行SET GLOBAL character_set_server=utf8

  2. 切换到 sam-mysql-ruby 适配器(而不是标准 mysql 适配器: http: //gemcutter.org/gems/sam-mysql-ruby

  3. 重新启动的轨道

错误是: "invalid byte sequence in US-ASCII" 奇怪的是,按照上述步骤操作后,我们的生产服务器上的错误并没有改变。在 database.yml 中的设置encoding: utf8也不会改变错误。

以下代码行引发的错误: <%= link_to h(question.title), question_path(question) %>

该博客似乎建议修复,但它提到这在 1.9 中应该不是问题:http ://www.igvita.com/2007/04/11/secure-utf-8-input-in-rails/ (并且已经超过 2 岁)。

我想随着越来越多的 Rails 开发人员转向 1.9,这个问题可能很快会影响到很多人。

4

3 回答 3

1

我找到了解决方案:

问题是:

Fetching data from any database (Mysql, Postgresql, Sqlite2 & 3), all configured to have UTF-8 as it's character set, returns the data with ASCII-8BIT in ruby 1.9.1 and rails 2.3.2.1. (取自:https ://rails.lighthouseapp.com/projects/8994/tickets/2476 )

我尝试使用已修补的 mysql 适配器可能失败,因为我的数据库未配置为原生使用 utf8,因此已修补的适配器无法正常工作。

修复最终是使用此处提供的补丁文件:http: //gnuu.org/2009/11/06/ruby19-rails-mysql-utf8/

require 'mysql'

class Mysql::Result
  def encode(value, encoding = "utf-8")
    String === value ? value.force_encoding(encoding) : value
  end

  def each_utf8(&block)
    each_orig do |row|
      yield row.map {|col| encode(col) }
    end
  end
  alias each_orig each
  alias each each_utf8

  def each_hash_utf8(&block)
    each_hash_orig do |row|
      row.each {|k, v| row[k] = encode(v) }
      yield(row)
    end
  end
  alias each_hash_orig each_hash
  alias each_hash each_hash_utf8
end

(放置在 lib/mysql_utf8fix.rb 并在 enviornment.rb 中使用require 'lib/mysql_utf8fix.rb'

于 2010-01-19T05:14:43.507 回答
0

它只需要'mysql_utf8fix.rb'(rails 2.3.11)

于 2011-03-17T21:00:35.630 回答
0

请在 database.yml 中使用 mysql2(gem) 适配器而不是 mysql 适配器

并删除 mysql 补丁(如果存在)并在 environment.rb 中添加以下行。

Encoding.default_external = 编码::UTF_8

Encoding.default_internal = 编码::UTF_8

然后在 apache 和乘客中运行它会正常工作

谢谢,

拉马纳维尔·塞尔瓦拉茹。

于 2011-04-25T07:10:37.957 回答