Rails + Ruby 1.9“US-ASCII中的无效字节序列”
升级到ruby 1.9后,我们开始注意到当用户使用非ASCII字符时,无法从rails模板渲染器渲染页面。 特别是“é”。 我能够在其中一台登台服务器上解决此问题,但我无法在我们的生产服务器上重现该修复程序。
似乎第一次工作的修复:
-
使用此处提供的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
-
切换到sam-mysql-ruby适配器(而不是标准的mysql适配器: http : //gemcutter.org/gems/sam-mysql-ruby )
-
重启导轨
错误是: "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。