【问题标题】:Rails + Ruby 1.9 "invalid byte squence in US-ASCII"Rails + Ruby 1.9“US-ASCII 中的无效字节序列”
【发布时间】:2010-01-19 03:24:22
【问题描述】:

升级到 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" 奇怪的是,按照上述步骤操作后,我们的生产服务器上的错误并没有改变。在 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,这个问题可能很快就会影响到很多人。

【问题讨论】:

    标签: ruby-on-rails ruby utf-8 character-encoding ruby-1.9


    【解决方案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' 需要)

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        Encoding.default_external = 编码::UTF_8

        Encoding.default_internal = 编码::UTF_8

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

        谢谢,

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-16
          • 2011-04-10
          • 2011-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-24
          • 1970-01-01
          相关资源
          最近更新 更多