Rails + Ruby 1.9“US-ASCII中的无效字节序列”

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

似乎第一次工作的修复:

  1. 使用此处提供的convert_charset工具将数据库从latin1转换为utf8: http ://www.mysqlperformanceblog.com/2009/03/17/converting-character-sets/。 (包括在my.cnf中设置default_character_set=utf8并运行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"奇怪的是,按照上述步骤操作后,我们的生产服务器上的错误没有改变。 设置encoding: utf8 database.yml中的encoding: utf8也不会更改错误。

以下代码行引发的错误:

这个博客似乎提出了一个解决方案,但它提到这应该不是1.9中的问题: http : //www.igvita.com/2007/04/11/secure-utf-8-input-in-rails/ (它超过2岁)。

我想这个问题可能会很快影响很多人,因为更多的rails开发人员转向1.9。

我找到了解决方案:

问题是:

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'

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

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

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

Encoding.default_external =编码:: UTF_8

Encoding.default_internal =编码:: UTF_8

然后在阿帕奇和乘客运行它会工作正常

谢谢,

Ramanavel Selvaraju。