环境:Ruby 1.9.1+Rails2.3.8

当从数据库中读取中文字符时出现如下错误(数据库为mysql UTF-8字符集):

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.rb

xxx-adapter.rb文件位于.../activerecord-2.3.8/lib/active_record/connection_adapters/目录下,为数据库驱动文件。

修改如下:

 ...

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

...

修改mysql_adapter.rb文件后问题得以解决。

转载于:https://blog.51cto.com/consy/399962

Rails字符集问题相关推荐

  1. rails与mysql之间中文数据显示不一致的问题

    在使用rails做web开发的时候,数据库选用mysql会出现这种问题: 从web页面传入数据库的中文,会在mysql中显示为乱码,而在mysql中录入的数据会在web页面显示问号,原因就是字符集不统 ...

  2. 数据库字符集utf8和utf8mb4的详细区别

    最近我遇到了一个bug,我试着通过Rails在以"utf8"编码的MariaDB中保存一个UTF-8字符串,然后出现了一个离奇的错误: Incorrectstringvalue:' ...

  3. linux 添加宋体字符集,Linux下安装中文宋体

    1,#cd /usr/share/fonts/default 2,mkdir -p ./truetype/simsun 3,取得simsun.ttc文件:如果网上下载不到则在windows (c:/w ...

  4. oracle查看数据库字符编码,oracle 查看、批改字符集编码

    当前位置:我的异常网» 数据库 » oracle 查看.批改字符集编码 oracle 查看.批改字符集编码 www.myexceptions.net  网友分享于:2013-07-19  浏览:3次 ...

  5. 《windows核心编程系列》二谈谈ANSI和Unicode字符集

    第二章:字符和字符串处理 使用vc编程时项目-->属性-->常规栏下我们可以设置项目字符集合,它可以是ANSI(多字节)字符集,也可以是unicode字符集.一般情况下说Unicode都是 ...

  6. zhs16gbk对应mysql_[Oracle] 彻底搞懂Oracle字符集

    基本概念字符集(Character set):是一个系统支持的所有抽象字符的集合.字符是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等.常见的字符集有ASCII,ZHS16GB231 ...

  7. 设置mysql默认字符集_MySQL之修改默认引擎和字符集

    一.数据库引擎 1.1 查看数据库引擎 mysql> show engines; +--------------------+---------+------------------------ ...

  8. 关于mysql字符集及导入导出

    MySQL字符集设置 • 系统变量: – character_set_server:默认的内部操作字符集 – character_set_client:客户端来源数据使用的字符集 – characte ...

  9. 关于jsp页面中的pageEncoding和contentType以及html中的meta标签中字符集的设置(转)...

    转载:<关于JSP页面中的pageEncoding和contentType两种属性的区别> pageEncoding是jsp文件本身的编码 contentType的charset是指服务器 ...

最新文章

  1. OneFlow 并行特色
  2. html的子页面获取自己url,如何从html页面获取url参数并将其显示在textarea中?
  3. 批量下载文件,循环中文件流没有关闭导致每次下载会累加之前的下载文件
  4. Linux环境下命令行截图【转】
  5. C++编程进阶3(如何写出正确的operator=、operator运算符的返回值以及是否应该是成员函数的讨论)
  6. EK算法应用,构图(POJ1149)
  7. QIPAIFANS网站程序【2013最新版】
  8. 【codevs1040】【01NOIPTG】统计单词个数,字符串的划分DP
  9. 疫情加速中国服务器采购 数字化转型成为增长“新引擎”
  10. 2017计算机基础教学大纲,2017级大学计算机基础教学大纲
  11. 微博批量发布,微博定时发布,批量删除,批量评论等功能的实现
  12. hcna华为认证网络工程师
  13. java加按钮_剪辑大神都在用的加字幕神器,你知道嘛!
  14. 软件测试工程师必备知识点
  15. 【什么是IaaS,PaaS,SaaS? DaaS又是什么?】
  16. 三、Eureka注册与发现之Eureka Comsumer
  17. opengl 多边形线框_opengl基础学习专题 (三) 多边形绘制的几种样式
  18. WRF气象数据之NECP FNL数据批量下载
  19. spotify能免费下歌吗_什么是Spotify Duo,它适合您吗?
  20. layaari2-cmd 踩坑记录,解决安装失败问题

热门文章

  1. Java数据结构 利用双栈实现链表操作
  2. matlab 绘图2
  3. matlab 求圆的周长和面积
  4. Vivado中用于时钟操作的几个Tcl命令
  5. 【 Verilog HDL 】赋值冲突问题
  6. 50倍时空算力提升,阿里云RDS PostgreSQL GPU版本上线
  7. JavaScriptSerializer序列化和反序列化JSON:使用自定义JavaScriptConverter
  8. istio入门(05)istio的架构概念2
  9. 正則表達式截取字符串两字符间的内容
  10. 更改ORACLE归档路径及归档模式