论坛首页 编程语言技术论坛

Ruby 1.9.1+Rails 2.3.2+ActiveScaffold 1.2RC1 编码问题

浏览 5936 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-03-27   最后修改:2009-03-27

环境:Ruby 1.9.1+Rails2.3.2+ActiveScaffold 1.2RC1,错误提示:

Encoding::CompatibilityError

incompatible character encodings: ASCII-8BIT and UTF-8


 

这个问题会有两种情况导致:

1、问题环境:模板中有<%="汉字"%>,且有UTF-8的字串变量,如I18n.t(:hello)返回的是UTF-8串。

      问题所在:Ruby 1.9.1的ERB处理编码的方式,看代码erb.rb

 

def compile(s)
      enc = s.encoding
      raise ArgumentError, "#{enc} is not ASCII compatible" if enc.dummy?
      s = s.dup.force_encoding("ASCII-8BIT") # don't use constant Enoding::ASCII_8BIT for miniruby
      enc = detect_magic_comment(s) || enc

.....

 

这样,s的编码是"ASCII-8BIT",模板就是ASCII-8BIT编码,当有UTF-8的字串变量concat时,出错。

      解决方案:在 enc = detect_magic_comment(s) || enc 后添加一行 s.force_encoding(enc)

2、问题环境:数据库返回UTF-8的数据时,ActiveScaffold的列表以及查看出错。

      问题所在:ActiveRecord返回的数据,编码成了ASCII-8BIT,看代码list_column_helps.rb,

def format_value(column_value, options = {})
        if column_empty?(column_value)
          active_scaffold_config.list.empty_field_text
        elsif column_value.is_a?(Time) || column_value.is_a?(Date)
          l(column_value, :format => options[:format] || :default)
        else
          column_value.to_s
        end
      end

我查到这里返回的值就是ASCII-8BIT编码了。查了下,从mysql_adapater出来的数据就是ASCII-8BIT的。

     解决方案:大家给点建议吧,SET NAME无效、database.yml的encoding无效。我最后是修改mysql_adapter

 

    def select(sql, name = nil)
          @connection.query_with_result = true
          result = execute(sql, name)
          rows = result.all_hashes
          result.free

 

#以下为新加部分

 

          if @config[:encoding] && @config[:encoding]=="utf8"
            rows.each do |row|
              row.each do |key, value|
                if (value.class == String)
                  value.force_encoding("UTF-8")
                end
              end
            end
          end
#以上为新加部分
          rows
        end

   发表时间:2009-03-27  
activescaffold的支持也是非常差的
bug也是长年类月没改进的
我觉得不要把这些支持都很差的一起用吧。
好痛苦的
0 请登录后投票
   发表时间:2009-03-27  
Scaffold的话还是不要用了,没看到有什么特别的地方
0 请登录后投票
   发表时间:2009-05-04  
我用rails 2.3.2 + ruby1.8.6,错误提示,貌似是rails版本问题,请问是怎么解决的:
c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/core_ext/module/aliasing.rb:33:in `alias_method': undefined method `find_full_template_path' for class `ActionView::Base' (NameError)

        from c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/core_ext/module/aliasing.rb:33:in `alias_method_chain'

        from D:/ruby example/RailsApplication2/vendor/plugins/active_scaffold/lib/extensions/generic_view_paths.rb:33

        from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'

        from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'

        from c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:156:in `require'

        from c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:521:in `new_constants_in'

        from c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:156:in `require'

        from D:/ruby example/RailsApplication2/vendor/plugins/active_scaffold/environment.rb:63

         ... 25 levels...

        from c:/ruby/lib/ruby/gems/1.8/gems/rails-2.3.2/lib/commands/server.rb:84

        from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'

        from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'

0 请登录后投票
   发表时间:2009-05-06  
hehe ,不升级不就完了,客户要的是稳定的系统。
0 请登录后投票
   发表时间:2009-05-06  
除了activescaffold还有比较好用的插件吗?
0 请登录后投票
   发表时间:2009-05-27  
楼主,这篇文章是翻译的吧?我是了一下,两条都没有效果。两个问题都没解决
0 请登录后投票
   发表时间:2009-05-28  
看吧,果然一堆麻烦。XD

未来如果ruby再把String改成Unicode String,肯定会再出一堆麻烦。
0 请登录后投票
   发表时间:2009-12-08  
也碰到这个问题了, 问题是 mysql 2.8.1的GEM 好像有问题,只能返回 ascii-8bit

确实前面的一些 方法不能工作, 只有改动 mysql-adaptor 比较简单。但是这个方案是不是影响数据库的读取效率?

国外有人改了 mysql.c ,需要重新编译,在windows上不好弄。

真希望有人能更新下 mysql的GEM,这个问题谁也绕不过去的。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics