您的位置:首页 > 其它

使用redmine时出现incompatible character encodings: UTF-8 and ASCII-8BIT的解决方法

2011-01-10 20:31 399 查看
今天被这个问题困扰了一天,查了很久的资料,终于解决了,记在这里希望对有同样问题的朋友有帮助 :-)

这可能是由以下两种原因导致:

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

问题所在:Ruby 1.9.1的ERB处理编码的方式,看C:/Ruby192/lib/ruby/1.9.1中的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的。

解决方案:修改redmine根目录下的vendor/rails/activerecord/lib/active_record/connection_adapters中的mysql_adapter.rb文件,

找到以下代码:

def select(sql, name = nil)

@connection.query_with_result = true

result = execute(sql, name)

rows = result.all_hashes

result.free

rows

end

在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

这样我的这个问题就解决了,谁有更好的方法就分享一下~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐